这两天正在做一个项目,我的Flex客户端需要和.Net通讯,令人不爽的是.Net的字典(IDictionary)在序列化时都会转化成一个键值对的列表,而不是json最普通的对象。DataContractJsonSerializer会将每一个键值对折腾成{"Key":"age","Value":10},我希望的是"age":10。网上搜了很久,没什么好方法,想到了开源,下了个fastJson来玩,发现也一样,只不过变成了{"K":"age","V":10},还是不爽。最后看了一下源码,把字典序列化相关的类JSONSerializer的WriteDictionary方法改成了下面的样子,总算OK了:
private void WriteDictionary(IDictionary dic)
{
_output.Append("{");
bool pendingSeparator = false;
foreach (DictionaryEntry entry in dic)
{
if (pendingSeparator)
_output.Append(",");
WritePair(entry.Key.ToString(), entry.Value);
pendingSeparator = true;
}
_output.Append("}");
//_output.Append("[");
//bool pendingSeparator = false;
//foreach (DictionaryEntry entry in dic)
//{
// if (pendingSeparator)
// _output.Append(",");
// _output.Append("{");
// WritePair("k",entry.Key);
// _output.Append(",");
// WritePair("v",entry.Value);
// _output.Append("}");
// pendingSeparator = true;
//}
//_output.Append("]");
}
下面是测试代码:
static void Main(string[] args)
{
var dic = new Dic();
dic["no"] = 10;
var subDic = new Dic();
subDic["val"] = 12.3;
dic["detail"] = subDic;
var str = JSON.Instance.ToJSON(dic);
Console.WriteLine(str);
}
public class Lst : ArrayList { }
public class Dic : Hashtable { }
fastJson可以从这边下:
http://www.codeproject.com/KB/IP/fastJSON.aspx