如何使用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调用失败。
有什么简单的方法可以做到这一点,或者有什么方法可以绕过微软糟糕的字典反序列化?我也遇到了同样的问题。我通过使用一个实现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