使用DataContractJsonSerializer生成轻量级JSON

时间:2010-04-16 14:46:34

标签: c# json

我正在尝试使用.Net 3.5中的C#和DataContractJsonSerializer生成JSON。问题是我无法弄清楚如何根据我需要的结果构建正确的结构。

我尝试使用哈希表,列表对象和arraylists重现PHP的关联数组,但无法弄清楚如何使用DataContractJsonSerializer以最佳方式生成我的结果,而无需创建自己的递归循环来构建JSON。 / p>

最接近的方法是使用字典< string,Dictionary< string,string>> aproach,但结果太大,因为我不能“命名”键。

这就是我得到的:

[
   {
      "Key":"status",
      "Value":[
         {
            "Key":"value",
            "Value":"ok"
         }
      ]
   },
   {
      "Key":"1",
      "Value":[
         {
            "Key":"name",
            "Value":"Result1"
         },
         {
            "Key":"details",
            "Value":"Result 1 details"
         }
      ]
   },
   {
      "Key":"2",
      "Value":[
         {
            "Key":"name",
            "Value":"Result2"
         },
         {
            "Key":"details",
            "Value":"Result 2 details"
         }
      ]
   },
   {
      "Key":"caller",
      "Value":[
         {
            "Key":"value",
            "Value":"1135345"
         }
      ]
   }
]

这就是我想要的:

{
   "status":"ok",
   "response":[
      {
         "id":1,
         "name":"Result1"
         "details":"Result 1 details"
      },
      {
         "id":2,
         "name":"Result2"
         "details":"Result 2 details"
      },
      {
         "id":3,
         "name":"Result3"
         "details":"Result 3 details"
    ],
   "caller":"1135345"
}

有没有人知道如何使用C#生成这条JSON而无需加载整个Json.NET框架?我需要尽快生成这个项目,因为这个项目旨在成为一个网站搜索引擎。

2 个答案:

答案 0 :(得分:2)

在Dictionary上使用JavaScriptSerializer而不是DataContractJsonSerializer将删除Key / Value json属性并将它们变为“键控”数组。

http://msdn.microsoft.com/en-us/library/bb412168.aspx

您是否已使用[DataContract]和[DataMember]装饰器将您的类归因?

http://msdn.microsoft.com/en-us/library/bb412179.aspx

答案 1 :(得分:2)

您应该查看JavaScriptSerializer。它是.NET框架的一部分(在System.Web.Extensions中分发)。要获得您想要的结果,您可以这样做:

var results = new[]
{
    new{id=1,name="Result 1"},
    new{id=2,name="Result 2"},
    new{id=3,name="Result 3"}
};

var js = new JavaScriptSerializer();
var result = js.Serialize(new
{
    status = "ok",
    response = results,
    caller = 1135345
});

您可以使用匿名类,也可以使用任何现有类。工作得很好:) 此调用的返回值为:

{"status":"ok","response":[{"id":1,"name":"Result 1"},{"id":2,"name":"Result 2"},{"id":3,"name":"Result 3"}],"caller":1135345}