Serializing dictionaries with JavaScriptSerializer

后端 未结 5 704
南旧
南旧 2020-12-03 22:15

Apparently, IDictionary is serialized as an array of KeyValuePair objects (e.g., [{Key:\"foo\", Value:\"bar\"}, ...]

5条回答
  •  Happy的楠姐
    2020-12-03 22:36

    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 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 Serialize(object obj, JavaScriptSerializer serializer)
        {
            var result = new Dictionary();
            var dictionary = obj as IDictionary;
            foreach (var item in dictionary)
                result.Add(item.Key, item.Value);
            return result;
        }
        public override IEnumerable SupportedTypes
        {
            get
            {
                return new ReadOnlyCollection(new Type[] { typeof(your_type) });
            }
        }
    }
    
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
    jsonOfTest = javaScriptSerializer.Serialize(test);
    // {"x":"xvalue","y":"\/Date(1314108923000)\/"}
    

    Hope this helps!

提交回复
热议问题