2012-04-27 117 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

注:还有其他的方式来实现这一点,但我一直在使用这种方法。