W przypadku niektórych moich testów jednostkowych chcę mieć możliwość budowania określonych wartości JSON (w tym przypadku albumów z nagraniami), które można wykorzystać jako dane wejściowe dla testowanego systemu.
Mam następujący kod:
var jsonObject = new JObject();
jsonObject.Add("Date", DateTime.Now);
jsonObject.Add("Album", "Me Against The World");
jsonObject.Add("Year", 1995);
jsonObject.Add("Artist", "2Pac");
To działa dobrze, ale nigdy nie lubiłem składni „magicznego ciągu” i wolałbym coś bliższego składni właściwości expando w JavaScript, na przykład:
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";
Odpowiedzi:
A co powiesz na:
dynamic jsonObject = new JObject(); jsonObject.Date = DateTime.Now; jsonObject.Album = "Me Against the world"; jsonObject.Year = 1995; jsonObject.Artist = "2Pac";
źródło
dynamic
.dynamic jsonExpando = new ExpandoObject();
i dodać linię po kodzie:JObject jsonObject = JObject.FromObject(jsonExpando);
jsonObject.list = JToken.FromObject(mylist);
.Możesz użyć tej
JObject.Parse
operacji i po prostu podać tekst JSON rozdzielany pojedynczymi cudzysłowami.JObject o = JObject.Parse(@"{ 'CPU': 'Intel', 'Drives': [ 'DVD read/writer', '500 gigabyte hard drive' ] }");
Ma to tę zaletę, że faktycznie jest JSON, więc czyta się go jako JSON.
Lub masz dane testowe, które są dynamiczne, możesz użyć
JObject.FromObject
operacji i podać obiekt wbudowany.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 } } });
Dokumentacja Json.net dotycząca serializacji
źródło
JObject.FromObject
nie zadziała, jeśli istnieją właściwości ze znakami specjalnymi, takimi jak-
.Ani
dynamic
, aniJObject.FromObject
rozwiązanie nie działa, gdy masz właściwości JSON, które nie są prawidłowymi nazwami zmiennych C #, np"@odata.etag"
. Preferuję składnię inicjatora indeksatora w moich przypadkach testowych:JObject jsonObject = new JObject { ["Date"] = DateTime.Now, ["Album"] = "Me Against The World", ["Year"] = 1995, ["Artist"] = "2Pac" };
Posiadanie oddzielnego zestawu otaczających symboli do inicjowania
JObject
i dodawania do niego właściwości sprawia, że inicjatory indeksu są bardziej czytelne niż klasyczne inicjatory obiektów, szczególnie w przypadku złożonych obiektów JSON, jak poniżej:JObject jsonObject = new JObject { ["Date"] = DateTime.Now, ["Album"] = "Me Against The World", ["Year"] = 1995, ["Artist"] = new JObject { ["Name"] = "2Pac", ["Age"] = 28 } };
W przypadku składni inicjatora obiektu powyższa inicjalizacja wyglądałaby następująco:
JObject jsonObject = new JObject { { "Date", DateTime.Now }, { "Album", "Me Against The World" }, { "Year", 1995 }, { "Artist", new JObject { { "Name", "2Pac" }, { "Age", 28 } } } };
źródło
Istnieją środowiska, w których nie można używać dynamicznych (np. Xamarin.iOS) lub przypadki, w których po prostu szukasz alternatywy dla poprzednich prawidłowych odpowiedzi.
W takich przypadkach możesz:
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") )
Więcej dokumentacji tutaj: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm
źródło
Prosty sposób tworzenia newtonsoft JObject z Properties.
To jest przykładowe właściwości użytkownika
public class User { public string Name; public string MobileNo; public string Address; }
i chcę, aby ta właściwość w Newtonsoft JObject to:
JObject obj = JObject.FromObject(new User() { Name = "Manjunath", MobileNo = "9876543210", Address = "Mumbai, Maharashtra, India", });
Wynik będzie taki:
{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}
źródło
Wcześniej czy później będziesz miał własność o specjalnym charakterze. Możesz użyć indeksu lub kombinacji indeksu i właściwości.
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
źródło
Możesz użyć biblioteki Newtonsoft i używać jej w następujący sposób
using Newtonsoft.Json; public class jb { public DateTime Date { set; get; } public string Artist { set; get; } public int Year { set; get; } public string album { set; get; } } var jsonObject = new jb(); jsonObject.Date = DateTime.Now; jsonObject.Album = "Me Against The World"; jsonObject.Year = 1995; jsonObject.Artist = "2Pac"; System.Web.Script.Serialization.JavaScriptSerializer oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string sJSON = oSerializer.Serialize(jsonObject );
źródło