web-dev-qa-db-fra.com

Créer JSON à la volée avec JObject

Pour certains de mes tests unitaires, je souhaite avoir la possibilité de créer des valeurs JSON particulières (albums d'enregistrement dans ce cas) pouvant être utilisées comme 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 "chaîne magique" et préférerais quelque chose de plus proche de la syntaxe expando-property en JavaScript, comme ceci:

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

Eh bien, que diriez-vous de:

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

Vous pouvez utiliser le JObject.Parse opération et fournissez simplement du texte JSON délimité par des guillemets.

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

Cela présente l’avantage de Nice d’être JSON et se lit donc comme JSON.

Ou vous avez des données de test dynamiques, vous pouvez utiliser JObject.FromObject opération et fournit 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 Json.net pour la sérialisation

60
Lee Jensen

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

Dans ces cas, vous pouvez 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

28
Daniele D.

Ni dynamic, ni JObject.FromObject solution fonctionne lorsque vous avez des propriétés JSON qui ne sont pas des noms de variables C # valides, par exemple. "@odata.etag". Je préfère la syntaxe d'initialisation de l'indexeur dans mes cas 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 englobants pour initialiser JObject et y ajouter des propriétés rend les initialiseurs d'index plus lisibles que les initialiseurs d'objet classiques, en particulier 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 d'initialisation 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 }
        }
    }
};
26
Jatin Sanghvi

Un moyen simple de créer newtonsoft JObject à partir de propriétés.

Ceci est un exemple de propriétés utilisateur

public class User
{
    public string Name;
    public string MobileNo;
    public string Address;
}

et je veux que cette propriété dans newtonsoft JObject soit:

JObject obj = JObject.FromObject(new User()
{
    Name = "Manjunath",
    MobileNo = "9876543210",
    Address = "Mumbai, Maharashtra, India",
});

La sortie sera comme ceci:

{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}
1
Manjunath Bilwar

Tôt ou tard, vous aurez une propriété avec un caractère spécial. Vous pouvez utiliser l'index ou une combinaison d'index et de 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
0
PAS