2013-08-15 25 views
39

Đối với một số thử nghiệm đơn vị của tôi, tôi muốn khả năng tạo các giá trị JSON cụ thể (album ghi trong trường hợp này) có thể được sử dụng làm đầu vào cho hệ thống đang được kiểm tra.Tạo JSON khi đang di chuyển với JObject

Tôi có đoạn mã sau:

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

này hoạt động tốt, nhưng tôi chưa bao giờ thực sự thích cú pháp "kỳ diệu chuỗi" và muốn một cái gì đó gần gũi hơn với các cú pháp expando-bất động sản trong JavaScript như thế này:

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

Trả lời

69

Vâng, làm thế nào về:

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

Perfect! Chính xác những gì tôi đang tìm kiếm, hoàn toàn quên mất 'năng động'. –

+0

Vui vì tôi có thể giúp;) cổ vũ –

+0

Tôi nhận được 'Newtonsoft.Json.Linq.JObject' không chứa định nghĩa cho lỗi 'Ngày' khi tôi cố chạy mã của bạn. Cách tôi có thể làm cho nó hoạt động là thay đổi dòng đầu tiên thành: 'dynamic jsonExpando = new ExpandoObject();' và thêm một dòng sau mã của bạn: 'JObject jsonObject = JObject.FromObject (jsonExpando); ' – BornToCode

-3

Bạn có thể sử dụng Newtonsoft librar y và sử dụng nó như sau

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

bạn không thực sự sử dụng thư viện newtonsoft tại đây –

36

Bạn có thể sử dụng thao tác JObject.Parse và chỉ đơn giản cung cấp văn bản JSON được trích dẫn một lần.

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

Điều này có lợi ích thực sự là JSON và vì vậy nó đọc là JSON.

Hoặc bạn có dữ liệu thử nghiệm động, bạn có thể sử dụng hoạt động JObject.FromObject và cung cấp đối tượng nội tuyến.

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

JObject.FromObject phải được đánh dấu là câu trả lời chính xác. Cảm ơn. – Thomas

+0

Tôi nghĩ 'JObject.FromObject' sẽ không hoạt động nếu có các thuộc tính có các ký tự đặc biệt như' -'. –

12

Có một số môi trường nơi bạn không thể sử dụng động (ví dụ Xamarin.iOS) hoặc các trường hợp ở nơi mà bạn vừa tìm kiếm một thay thế cho câu trả lời hợp lệ trước đây.

Trong những trường hợp này bạn có thể làm:

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

Nhiều tài liệu ở đây: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm

2

Cả dynamic, cũng không JObject.FromObject giải pháp hoạt động khi bạn có đặc tính JSON mà không phải là C# biến tên hợp lệ ví dụ "@odata.etag". Tôi thích cú pháp initializer indexer trong các trường hợp thử nghiệm của tôi:

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

Có bộ riêng biệt của kèm theo biểu tượng cho khởi JObject và để thêm thuộc tính để nó làm cho initializers chỉ số dễ đọc hơn so initializers đối tượng cổ điển, đặc biệt là trong trường hợp của hợp chất JSON các đối tượng như sau:

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

với cú pháp khởi tạo đối tượng, khởi tạo ở trên sẽ là:

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

Cuối cùng là cú pháp tốt nhất để viết json trong C#. – abreneliere

Các vấn đề liên quan