2013-06-03 41 views
39

好的,所以我試圖通過http連接發送POST命令,並使用JSON格式來實現。我正在編寫程序在C#中執行此操作,並想知道如何格式化作爲JSON傳遞給服務器的值數組。在C#中創建JSON數組#

目前我有這樣的:

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

翻譯爲這JSON:

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

我想打一個數組,稱爲項目,其中每個元素都包含這三個值。所以它基本上是一個對象數組,其中對象包含名稱,索引和可選字段。

我的猜測是,這將是沿着這一線的東西:

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

其中,如果它是正確的語法,將轉化爲這JSON:

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

不過,看樣子我做錯了。想法?任何幫助表示讚賞。

+0

C#沒有JSON文字。你需要使用匿名類型。 – SLaks

+0

那就是我在做什麼。因此,'新'' – Nealon

+0

如果你想提供JSON serizalization,請看看:http://stackoverflow.com/questions/13278459/json-serialization-in-c-sharp。 – gustavodidomenico

回答

65

你很近。這應該做的伎倆:

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

如果源是一個枚舉某種形式的,你可能會想這樣做:

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

完美。謝謝。 – Nealon

+0

@Dave如果你需要動態地做這件事。就像for循環裏面一樣? – CodeEngine

+1

那麼,如果你在一個for循環,那麼你將不得不創建一個真正的模型,而不是使用匿名類型。如果你可以使用LINQ(如果你願意,我會更喜歡),那麼你可以簡單地將你的結果「投影」成一個匿名模型,就像我的例子。 –

25

你最好創建一些類的每個項目,而不是使用匿名對象。而在你序列化的對象中你應該有這些項目的數組。例如: -

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

用法:

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

,結果中你不會有改變的事情幾次,如果你需要改變的數據結構。

p.s. Here's複雜json小號

+0

+1。我也會這樣做。 –

+5

如果你有ASP.NET和Web Tools 2012,你也有這個好東西[粘貼JSON作爲類](http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as -classes-in-asp-net-and-web-tools-2012-2-rc.aspx)功能:) – khellang

+0

@KristianHellang不知道。謝謝。 ;) – Leri

5

而且,與匿名類型非常好的工具(我喜歡做到這一點) - 這僅僅是另一個方法。

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

結果:

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

+0

它給每個值反斜槓,例如\ command – 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

你能解釋這是怎麼回答這個問題嗎? – bummi