使用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属性?
答案 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)