2013-06-03 63 views
39

Ok, vì vậy tôi đang cố gắng gửi các lệnh POST qua kết nối http và sử dụng định dạng JSON để làm như vậy. Tôi đang viết chương trình để làm điều này trong C#, và đã tự hỏi làm thế nào tôi sẽ định dạng một mảng các giá trị được chuyển thành JSON tới máy chủ.Tạo một mảng JSON trong C#

Hiện nay tôi có điều này:

new {name = "command" , index = "X", optional = "0"}

Những dịch này trong JSON:

"name": "command", 
"index": "X", 
"optional": "0" 

Và tôi muốn thực hiện một mảng, gọi là mặt hàng, trong đó mỗi phần tử chứa ba giá trị này . Vì vậy, về cơ bản nó sẽ là một mảng các đối tượng, trong đó đối tượng có chứa một tên, một chỉ mục và một trường tùy chọn.

tôi đoán là nó sẽ là một cái gì đó dọc theo dòng này:

new {items = [(name = "command" , index = "X", optional = "0"), 
       (name = "status" , index = "X", optional = "0")]} 

nào, nếu nó là đúng cú pháp, sẽ dịch này trong JSON:

"items": 
[ 
    { 
     "name": "command", 
     "index": "X", 
     "optional": "0" 
    }, 
    { 
     "name": "status", 
     "index": "X", 
     "optional": "0" 
    } 
] 

Nhưng, rõ ràng Tôi đang làm sai. Ý tưởng? Bất kỳ trợ giúp được đánh giá cao.

+0

C# không có literals JSON. Bạn cần sử dụng các loại ẩn danh. – SLaks

+0

Đó là những gì tôi đang làm. do đó, 'mới' – Nealon

+0

Và nếu bạn muốn cung cấp sự phân tầng hóa JSON, hãy xem: http://stackoverflow.com/questions/13278459/json-serialization-in-c-sharp. – gustavodidomenico

Trả lời

65

Bạn thân thiết. Điều này sẽ làm các trick:

new {items = new [] { 
    new {name = "command" , index = "X", optional = "0"}, 
    new {name = "command" , index = "X", optional = "0"} 
}} 

Nếu nguồn của bạn là một đếm được của một số loại, bạn có thể muốn làm điều này:

new {items = source.Select(item => new 
{ 
    name = item.Name, index = item.Index, options = item.Optional 
})}; 
+0

hoàn hảo. cảm ơn bạn. – Nealon

+0

@Dave những gì về nếu bạn cần phải làm điều đó tự động. Giống như bên trong vòng lặp for? – CodeEngine

+1

Vâng, nếu bạn đang ở trong một vòng lặp for thì bạn sẽ phải tạo một mô hình thực thay vì sử dụng các kiểu ẩn danh. Nếu bạn có thể sử dụng LINQ (và tôi thích nếu bạn làm) thì bạn có thể chỉ cần "chiếu" các kết quả của bạn vào một mô hình ẩn danh như trong ví dụ của tôi. –

25

Bạn nên tạo một số lớp cho từng hạng mục thay vì sử dụng đối tượng ẩn danh. Và trong đối tượng bạn đang serializing bạn nên có mảng của những mục đó. Ví dụ .:

public class Item 
{ 
    public string name { get; set; } 
    public string index { get; set; } 
    public string optional { get; set; } 
} 

public class RootObject 
{ 
    public List<Item> items { get; set; } 
} 

Cách sử dụng:

var objectToSerialize = new RootObject(); 
objectToSerialize.items = new List<Item> 
          { 
          new Item { name = "test1", index = "index1" }, 
          new Item { name = "test2", index = "index2" } 
          }; 

Và trong kết quả bạn sẽ không phải để xoay chuyển nhiều lần nếu bạn cần thay đổi cấu trúc dữ liệu.

p.s. Here's công cụ rất tốt đẹp cho phức tạp json s

+0

+1. Tôi cũng sẽ làm điều này. –

+5

Nếu bạn có ASP.NET và Web Tools 2012, bạn cũng có [Paste JSON as classes] tuyệt vời (http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as -classes-in-asp-net-và-web-tools-2012-2-rc.aspx) tính năng :) – khellang

+0

@KristianHellang Không biết về nó. Cảm ơn. ;) – Leri

5

Ngoài ra, với các loại Anonymous (tôi thích không để làm điều này) - đây là chỉ cách tiếp cận khác.

void Main() 
{ 
    var x = new 
    { 
     items = new[] 
     { 
      new 
      { 
       name = "command", index = "X", optional = "0" 
      }, 
      new 
      { 
       name = "command", index = "X", optional = "0" 
      } 
     } 
    }; 
    JavaScriptSerializer js = new JavaScriptSerializer(); //system.web.extension assembly.... 
    Console.WriteLine(js.Serialize(x)); 
} 

kết quả:

{"items":[{"name":"command","index":"X","optional":"0"},{"name":"command","index":"X","optional":"0"}]}

+0

Nó cung cấp dấu gạch chéo ngược với mỗi giá trị, ví dụ: – Sami

-4
new {var_data[counter] =new [] { 
       new{ "S NO": "+ obj_Data_Row["F_ID_ITEM_MASTER"].ToString() +","PART NAME": " + obj_Data_Row["F_PART_NAME"].ToString() + ","PART ID": " + obj_Data_Row["F_PART_ID"].ToString() + ","PART CODE":" + obj_Data_Row["F_PART_CODE"].ToString() + ", "CIENT PART ID": " + obj_Data_Row["F_ID_CLIENT"].ToString() + ","TYPES":" + obj_Data_Row["F_TYPE"].ToString() + ","UOM":" + obj_Data_Row["F_UOM"].ToString() + ","SPECIFICATION":" + obj_Data_Row["F_SPECIFICATION"].ToString() + ","MODEL":" + obj_Data_Row["F_MODEL"].ToString() + ","LOCATION":" + obj_Data_Row["F_LOCATION"].ToString() + ","STD WEIGHT":" + obj_Data_Row["F_STD_WEIGHT"].ToString() + ","THICKNESS":" + obj_Data_Row["F_THICKNESS"].ToString() + ","WIDTH":" + obj_Data_Row["F_WIDTH"].ToString() + ","HEIGHT":" + obj_Data_Row["F_HEIGHT"].ToString() + ","STUFF QUALITY":" + obj_Data_Row["F_STUFF_QTY"].ToString() + ","FREIGHT":" + obj_Data_Row["F_FREIGHT"].ToString() + ","THRESHOLD FG":" + obj_Data_Row["F_THRESHOLD_FG"].ToString() + ","THRESHOLD CL STOCK":" + obj_Data_Row["F_THRESHOLD_CL_STOCK"].ToString() + ","DESCRIPTION":" + obj_Data_Row["F_DESCRIPTION"].ToString() + "} 
     } 
    }; 
+3

Bạn có thể giải thích cách này trả lời câu hỏi không? – bummi

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