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";
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";
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
}
}
});
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
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 }
}
}
};
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"}
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