如何使用JavascriptSerializer作为我的反序列化器

本文关键字:我的 反序列化 何使用 JavascriptSerializer | 更新日期: 2023-09-27 18:17:01

我不喜欢DataContractSerializer处理字典反序列化的方式。我的方法都返回一个流,我使用JavascriptDeserializer返回我想要的JSON,但这对我没有帮助,Dictionary是POST参数之一。

JavascriptSerializer处理Dictionary的方式如下:

{"myKey1":"myValue1", "myKey2":"myValue2"}

DataContractSerializer这样做:

[{"Key":"myKey1", "Value":"myValue1"}, {"Key":"myKey2", "Value":"myValue2"}]

问题是,我们的Android和iPhone应用程序正在本地生成代码,我们的AJAX调用失败。

有什么简单的方法可以做到这一点,或者有什么方法可以绕过微软糟糕的字典反序列化?

如何使用JavascriptSerializer作为我的反序列化器

我也遇到了同样的问题。我通过使用一个实现isserializable的自定义Dictionary(实际上是一个包装器)来解决这个问题。

[Serializable]
public class CustomDictionary: ISerializable
{
    /// <summary>
    /// Inner object.
    /// </summary>        
    private Dictionary<string, string> innerDictionary;
    public CustomDictionary()
    {
        innerDictionary = new Dictionary<string, string>();
    }
    public CustomDictionary(IDictionary<string, string> dictionary)
    {
        innerDictionary = new Dictionary<string, string>(dictionary);
    }
    public Dictionary<string, string> InnerDictionary
    {
        get { return this.innerDictionary; }
    }
    //Used when deserializing
    protected CustomDictionary(SerializationInfo info, StreamingContext context)
    {
        if (object.ReferenceEquals(info, null)) throw new ArgumentNullException("info");
        innerDictionary = new Dictionary<string, string>();
        foreach (SerializationEntry entry in info)
        {
            innerDictionary.Add(entry.Name, entry.Value as string);
        }
    }
    //Used when serializing
    protected virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (!object.ReferenceEquals(info, null))
        {
            foreach (string key in innerDictionary.Keys)
            {
                string value = innerDictionary[key];
                info.AddValue(key, value);
            }
        }
    }
    //Add methods calling InnerDictionary as necessary (ContainsKey, Add, etc...)
}

使用jsonserializer对象

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

这里有一篇详细的解决方案的博客文章:http://pietschsoft.com/post/2008/02/NET-35-JSON-Serialization-using-the-DataContractJsonSerializer.aspx