2012-04-27 106 views
4

我能夠很容易地創建一個平坦的序列化JSON字符串用C#創建C#嵌套JSON

我的問題是,我想創建以下

[ { 
    title: "Yes", 
    id : "1", 
    menu: [ { 
     title: "Maybe", 
     id : "3", 
     alert : "No", 
     menu: [ { 
      title: "Maybe Not", 
      id : "8", 
      alert : "No", 
      menu: [] 
     } ] 
    } ] 
}, 
{ 
    title: "No", 
    id : "2", 
    menu: [] 
}] 

任何幫助一個嵌套串像這將是大

+1

您是否使用JSON.Net庫或自定義實現?檢查圖書館是否可以提供幫助 - 將爲您節省大量時間... – Sunny 2012-04-27 16:11:15

+0

您將什麼定義爲*嵌套字符串*? – 2012-04-27 16:13:02

+1

@cWilk,你應該張貼您的代碼(預計1條或2號線),顯示創建JSON你選擇什麼特別的「非常容易」的方式。從SP – 2012-04-27 16:16:17

回答

9

您使用MVC 3? - 做這樣的事情:

return Json(myObectWithListProperties, JsonRequestBehavior.AllowGet); 

我用它來返回複雜的c#對象,匹配我想要的javascript對象的結構。

例如爲:

 var bob = new { 
      name = "test" 
      ,orders = new[] { 
       new { itemNo = 1, description = "desc"} 
       ,new { itemNo = 2, description = "desc2"} 
      } 
     }; 

     return Json(bob, JsonRequestBehavior.AllowGet); 

給出:

{ 
    "name":"test", 
    "orders":[ 
     { 
     "itemNo":1, 
     "description":"desc" 
     }, 
     { 
     "itemNo":2, 
     "description":"desc2" 
     } 
    ] 
} 

編輯:一個有趣的一點嵌套:

 var bob = new { 
      name = "test" 
      , 
      orders = new [] { 
       new { itemNo = 1, description = "desc"} 
       ,new { itemNo = 2, description = "desc2"} 

      } 
      ,test = new { 
        a = new { 
         b = new { 
          something = "testing" 
          ,someOtherThing = new { 
           aProperty="1" 
           ,another="2" 
           ,theThird=new{ 
            bob="quiteDeepNesting" 
           } 
          } 
         } 
        } 
       } 
     }; 

     return Json(bob, JsonRequestBehavior.AllowGet); 

給出:

{ 
    "name":"test", 
    "orders":[ 
     { 
     "itemNo":1, 
     "description":"desc" 
     }, 
     { 
     "itemNo":2, 
     "description":"desc2" 
     } 
    ], 
    "test":{ 
     "a":{ 
     "b":{ 
      "something":"testing", 
      "someOtherThing":{ 
       "aProperty":"1", 
       "another":"2", 
       "theThird":{ 
        "bob":"quiteDeepNesting" 
       } 
      } 
     } 
     } 
    } 
} 
+0

不知道這是相當我後,我不知道有多少嵌套級別會有撥打電話到數據庫時,多個對象,wtith潛在的多個對象 – cWilk 2012-04-27 16:29:26

+0

沒有選中限制(如果有的話但只是打開了一個應用程序,其中出貨具有狀態爲所有複雜對象的項目集合。似乎運行良好 – gordatron 2012-04-27 16:32:47

+0

以及工作..給它一個去,如果你使用MVC 3希望它會是一個快速測試 – gordatron 2012-04-27 16:41:08

4

嘗試使用

using System.Web.Script.Serialization; 

//Assumed code to connect to a DB and get data out using a Reader goes here 

Object data = new { 
    a = reader.GetString(field1), 
    b = reader.GetString(field2), 
    c = reader.GetString(field3) 
}; 
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); 
string json = javaScriptSerializer.Serialize(data); 

這是內置的,並節省您序列化到JSON自己的工作!

本示例假設您正在從數據庫中使用某種閱讀器獲取數據,然後它構造你想用一個匿名類序列化對象。您的匿名類可以像您需要的那樣簡單或複雜,並且JavaScriptSerializer會將其轉換爲JSON。這種方法也很有用,因爲您可以輕鬆控制它將在JSON中創建的JSON屬性名稱。

+0

我應該多給一點信息,我查詢數據庫帶回來說10個項目的列表,每個都有唯一的ID和父鍵,我想建立我的對象,然後序列化成JSON,我相信建設的對象並將正確的孩子分配給正確的父母是我問題所在的地方 – cWilk 2012-04-30 07:17:19

+0

沒問題 - 我自己在我工作的應用程序中完成了同樣的任務。我從數據庫中獲取結果並用它創建一個匿名類,然後將其傳遞給序列化方法。因此,對於上面的「數據」對象,您可以像這樣構造它:new {a = reader.GetString(field1),b = reader.GetString(field2),c = reader.GetString(field3)};對傳遞給JavaScriptSerializer的Serialize方法的對象使用匿名類聲明,可以輕鬆控制JSON中要包含的內容以及它將如何表示,而無需創建指定的類。 – Shawn 2012-04-30 16:53:25

0

您可以使用ExpandoObjectSystem.Dynamic命名空間。

下面是實現您的解決方案小片段:

 dynamic parameters = new dynamic[2]; 

     parameters[0] = new ExpandoObject(); 
     parameters[0].title = "Yes"; 
     parameters[0].id = "1"; 

     parameters[0].menu = new dynamic[1]; 
     parameters[0].menu[0] = new ExpandoObject(); 

     parameters[0].menu[0].title = "Maybe"; 
     parameters[0].menu[0].id = "3"; 
     parameters[0].menu[0].alert = "No"; 
     parameters[0].menu[0].menu = new dynamic[1]; 
     parameters[0].menu[0].menu[0] = new ExpandoObject(); 
     parameters[0].menu[0].menu[0].title = "Maybe Not"; 
     parameters[0].menu[0].menu[0].id = "8"; 
     parameters[0].menu[0].menu[0].alert = "No"; 
     parameters[0].menu[0].menu[0].menu = new dynamic[0]; 

     parameters[1] = new ExpandoObject(); 
     parameters[1].title = "No"; 
     parameters[1].id = "2"; 
     parameters[1].menu = new dynamic[0]; 


     string json = JsonConvert.SerializeObject(parameters, Formatting.Indented); 
     Console.WriteLine(json); 

Here is the work in fiddle

注:還有其他的方式來實現這一點,但我一直在使用這種方法。