Serializing dictionaries with JavaScriptSerializer

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

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

5条回答
  •  -上瘾入骨i
    2020-12-03 22:33

    Here's an I believe improved version from Tomas answer. Works like a charm. We could also add a check for the ScriptIgnore attribute but well, knock yourself out.

    BTW, I chose JavaScriptSerializer because in my opinion third party solutions are most of the time: less known, long to install, often forgotten pre-requities and have blur copy-right states that make them risky to distribute in business.

    P-S: I didn`t understood why we were trying to deserialize both to the instance and to the instance as a dictionary, so I stripped that part.

    public class KeyValuePairJsonConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary deserializedJSObjectDictionary, Type targetType, JavaScriptSerializer javaScriptSerializer)
        {
            Object targetTypeInstance = Activator.CreateInstance(targetType);
    
            FieldInfo[] targetTypeFields = targetType.GetFields(BindingFlags.Public | BindingFlags.Instance);
    
            foreach (FieldInfo fieldInfo in targetTypeFields)
                fieldInfo.SetValue(targetTypeInstance, deserializedJSObjectDictionary[fieldInfo.Name]);
    
            return targetTypeInstance;
        }
    
        public override IDictionary Serialize(Object objectToSerialize, JavaScriptSerializer javaScriptSerializer)
        {
           IDictionary serializedObjectDictionary = new Dictionary();
    
           FieldInfo[] objectToSerializeTypeFields = objectToSerialize.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
    
           foreach (FieldInfo fieldInfo in objectToSerializeTypeFields)
               serializedObjectDictionary.Add(fieldInfo.Name, fieldInfo.GetValue(objectToSerialize));
    
           return serializedObjectDictionary;
        }
    
        public override IEnumerable SupportedTypes
        {
            get
            {
                return new ReadOnlyCollection(new Type[] { typeof(YOURCLASSNAME) });
            }
        }
    }
    

提交回复
热议问题