135 votes

Création de JSON à la volée avec JObject

Pour certains de mes tests unitaires, je veux pouvoir créer des valeurs JSON particulières (des albums de disques dans ce cas) qui peuvent être utilisées comme données d'entrée pour le système testé.

J'ai le code suivant :

var jsonObject = new JObject();
jsonObject.Add("Date", DateTime.Now);
jsonObject.Add("Album", "Me Against The World");
jsonObject.Add("Year", 1995);
jsonObject.Add("Artist", "2Pac");

Cela fonctionne bien, mais je n'ai jamais vraiment aimé la syntaxe de la "chaîne magique" et je préférerais quelque chose de plus proche de la syntaxe des propriétés expando en JavaScript, comme ceci :

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

194voto

Dimitar Dimitrov Points 6551

Eh bien, que diriez-vous :

dynamic jsonObject = new JObject();
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against the world";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

97voto

Lee Jensen Points 188

Vous pouvez utiliser le JObject.Parse et fournissez simplement un texte JSON délimité par des guillemets simples.

JObject  o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");

Cela présente l'avantage d'être en fait du JSON et donc d'être lu comme du JSON.

Si vous avez des données de test qui sont dynamiques, vous pouvez utiliser JObject.FromObject et fournir un objet en ligne.

JObject o = JObject.FromObject(new
{
    channel = new
    {
        title = "James Newton-King",
        link = "http://james.newtonking.com",
        description = "James Newton-King's blog.",
        item =
            from p in posts
            orderby p.Title
            select new
            {
                title = p.Title,
                description = p.Description,
                link = p.Link,
                category = p.Categories
            }
    }
});

Documentation de Json.net sur la sérialisation

70voto

Jatin Sanghvi Points 23

Ni l'un ni l'autre dynamic ni JObject.FromObject fonctionne lorsque vous avez des propriétés JSON qui ne sont pas des noms de variables C# valides, par ex. "@odata.etag" . Je préfère la syntaxe de l'initialisation de l'indexeur dans mes scénarios de test :

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = "2Pac"
};

Avoir un ensemble séparé de symboles d'entourage pour initialiser JObject et pour y ajouter des propriétés rend les initialisateurs d'index plus lisibles que les initialisateurs d'objets classiques, surtout dans le cas d'objets JSON composés comme ci-dessous :

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = new JObject
    {
        ["Name"] = "2Pac",
        ["Age"] = 28
    }
};

Avec la syntaxe de l'initialisateur d'objet, l'initialisation ci-dessus serait :

JObject jsonObject = new JObject
{
    { "Date", DateTime.Now },
    { "Album", "Me Against The World" },
    { "Year", 1995 }, 
    { "Artist", new JObject
        {
            { "Name", "2Pac" },
            { "Age", 28 }
        }
    }
};

37voto

Daniele D. Points 1781

Il existe des environnements dans lesquels vous ne pouvez pas utiliser la dynamique (par exemple Xamarin.iOS) ou des cas dans lesquels vous cherchez simplement une alternative aux réponses valables précédentes.

Dans ces cas, vous pouvez le faire :

using Newtonsoft.Json.Linq;

JObject jsonObject =
     new JObject(
             new JProperty("Date", DateTime.Now),
             new JProperty("Album", "Me Against The World"),
             new JProperty("Year", "James 2Pac-King's blog."),
             new JProperty("Artist", "2Pac")
         )

Plus de documentation ici : http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm

7voto

PAS Points 95

Tôt ou tard, vous aurez une propriété avec un caractère spécial, par exemple Create-Date. Le trait d'union ne sera pas autorisé dans le nom de la propriété. Cela va casser votre code. Dans un tel scénario, vous pouvez soit utiliser l'index ou la combinaison de l'index et de la propriété.

dynamic jsonObject = new JObject();
jsonObject["Create-Date"] = DateTime.Now; //<-Index use
jsonObject.Album = "Me Against the world"; //<- Property use
jsonObject["Create-Year"] = 1995; //<-Index use
jsonObject.Artist = "2Pac"; //<-Property use

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X