序列化与词典的JavaScriptSerializer [英] Serializing dictionaries with JavaScriptSerializer
问题描述
显然,的IDictionary<字符串对象>
序列化为 KeyValuePair </ code>对象(数组例如,
[{键:富,值:酒吧},...]
)。是否可以序列化一个对象,而不是(例如, {富:酒吧}
)?
Apparently, IDictionary<string,object>
is serialized as an array of KeyValuePair
objects (e.g., [{Key:"foo", Value:"bar"}, ...]
). Is is possible to serialize it as an object instead (e.g., {foo:"bar"}
)?
推荐答案
虽然我同意的JavaScriptSerializer是废话和Json.Net是一个更好的选择,有一种方法可以在其中做出的JavaScriptSerializer序列化你想要的方式。
你将不得不注册一个转换器,并使用像这样覆盖Serialize方法:
Although I agree that JavaScriptSerializer is a crap and Json.Net is a better option, there is a way in which you can make JavaScriptSerializer serialize the way you want to. You will have to register a converter and override the Serialize method using something like this:
public class KeyValuePairJsonConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
var instance = Activator.CreateInstance(type);
foreach (var p in instance.GetType().GetPublicProperties())
{
instance.GetType().GetProperty(p.Name).SetValue(instance, dictionary[p.Name], null);
dictionary.Remove(p.Name);
}
foreach (var item in dictionary)
(instance).Add(item.Key, item.Value);
return instance;
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
var result = new Dictionary<string, object>();
var dictionary = obj as IDictionary<string, object>;
foreach (var item in dictionary)
result.Add(item.Key, item.Value);
return result;
}
public override IEnumerable<Type> SupportedTypes
{
get
{
return new ReadOnlyCollection<Type>(new Type[] { typeof(your_type) });
}
}
}
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
jsonOfTest = javaScriptSerializer.Serialize(test);
// {"x":"xvalue","y":"\/Date(1314108923000)\/"}
希望这有助于!
这篇关于序列化与词典的JavaScriptSerializer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!