2013-08-15 11 views
39

Dla niektórych testów jednostkowych chcę mieć możliwość budowania konkretnych wartości JSON (albumy w tym przypadku), które mogą być użyte jako dane wejściowe dla testowanego systemu.Tworzenie JSON w locie z JObject

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

Działa to dobrze, ale nigdy nie miał naprawdę jak składni „magia smyczkowy” i woleliby coś bliżej składni EXPANDO nieruchomości w JavaScript tak:

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

Odpowiedz

69

Cóż, jak o:

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

Perfect! Dokładnie tego, czego szukałem, zupełnie zapomniałem o 'dynamice'. –

+0

Cieszę się, że mogę pomóc;) Pozdrawiam –

+0

Otrzymuję "Newtonsoft.Json.Linq.JObject" nie zawiera definicji błędu "Data" podczas próby uruchomienia kodu. Sposób, w jaki mogę to zrobić, to zmienić pierwszą linię na: 'dynamic jsonExpando = new ExpandoObject();' i dodaj linię po kodzie: 'JObject jsonObject = JObject.FromObject (jsonExpando); ' – BornToCode

-3

można użyć Newtonsoft udogodnien y i używać go w sposób następujący

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); 
+3

w rzeczywistości nie używasz biblioteki newtonsoft tutaj –

36

Można użyć operacji JObject.Parse i po prostu dostarczać pojedynczy cytat rozdzielany tekst JSON.

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

Ma to dobrą zaletę, że faktycznie jest JSON i dlatego brzmi jak JSON.

Albo masz dane testowe, które są dynamiczne, możesz użyć operacji JObject.FromObject i dostarczyć 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 
      } 
    } 
}); 

Json.net documentation for serialization

+3

Obiekt JObject.FromObject powinien zostać oznaczony jako poprawna odpowiedź. Dzięki. – Thomas

+0

Myślę, że 'JObject.FromObject' nie będzie działać, jeśli istnieją właściwości ze znakami specjalnymi, jak' -'. –

12

Istnieją pewne środowisko, gdzie nie można wykorzystać dynamiczne (np Xamarin.iOS) lub przypadki, w którym po prostu szukać alternatywy do poprzednich poprawnych odpowiedzi.

W tych przypadkach można zrobić:

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

2

Ani dynamic, ani JObject.FromObject rozwiązanie działa, jeśli mają właściwości JSON, które nie są ważne nazwy zmiennych C# na przykład "@odata.etag". Wolę składnię initializer indeksatora w moich testów:

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

uwzględniając oddzielny zestaw załączając symboli dla inicjowania JObject i dodawania właściwości czyni z inicjatorów indeksu bardziej czytelne niż klasyczne inicjatorów obiektu, szczególnie w przypadku złożonych JSON obiektów, jak poniżej:

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

składni inicjatora obiektu, powyższy inicjalizacji byłoby:

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

Ostatni jest zdecydowanie najlepszą składnią do napisania json w języku C#. – abreneliere