.NET:我可以使用DataContractJsonSerializer序列化为JSON关联数组吗?

时间:2010-05-13 12:20:30

标签: .net asp.net wcf json

使用DataContractJsonSerializer序列化字典时,如下所示:

[CollectionDataContract]
public class Clazz : Dictionary<String,String> {}

    ....

    var c1 = new Clazz();
    c1["Red"] = "Rosso";
    c1["Blue"] = "Blu";
    c1["Green"] = "Verde";

使用以下代码序列化c1:

    var dcjs = new DataContractJsonSerializer(c1.GetType());
    var json = new Func<String>(() =>
        {
            using (var ms = new System.IO.MemoryStream())
            {
                    dcjs.WriteObject(ms, c1);
                    return Encoding.ASCII.GetString(ms.ToArray());
            }
        })();

...生成这个JSON:

[{"Key":"Red","Value":"Rosso"},
 {"Key":"Blue","Value":"Blu"},
 {"Key":"Green","Value":"Verde"}]

但是,这不是一个Javascript关联数组。如果我在javascript中执行相应的操作:生成一个字典然后序列化它,如下所示:

var a = {};
a["Red"] = "Rosso";
a["Blue"] = "Blu";
a["Green"] = "Verde";

// use utility class from http://www.JSON.org/json2.js
var json = JSON.stringify(a);

结果是:

{"Red":"Rosso","Blue":"Blu","Green":"Verde"}

如何让DCJS生成或使用字典的序列化字符串,与JSON2.js兼容?


我从ASP.NET了解JavaScriptSerializer。不确定它是否非常适合WCF。它是否尊重DataMember,DataContract属性?

2 个答案:

答案 0 :(得分:2)

它正在做的事情是非常明智的,它产生的JSON是JSON中.net字典的合理表示。如果您想要描述JSON输出,则需要序列化类

public class ColourThingy
{
      public string Red {get;set;}
      public string Blue {get;set;}
      public string Green {get;set;}
}
ColourThingy MyColourThingy = new ColourThingy();
MyColourThingy.Red = "Rosso";
...

记住JavaScript关联数组不是真正的数组,你只是在利用object [“key”]是另一种引用object.key的方式。因此,当它将.net字典序列化为JSON时,它会生成一个键/值对对象数组,与您期望的完全一样。

答案 1 :(得分:0)