使用JSON对字典进行序列化和反序列化

时间:2020-01-01 17:24:39

标签: c# json dictionary json.net

我想序列化包含不同类型对象的字典(动态)并将其保存到文件中。加载文件时,软件需要再次将数据反序列化为Dictionary并设置对象引用。当我尝试设置一个对象时,它给了我错误:

无法将类型'Newtonsoft.Json.Linq.JObject'隐式转换为 “ PartyCreator.Member”。

反序列化词典似乎正在运行,例如,我可以使用loadedObjects["member1"].Name访问member1属性,但不能将该对象引用到通过我自己的Member类创建的现有对象member1。

// Serializing the Dictionary           
Dictionary<string, dynamic> savedObjects = new Dictionary<string, dynamic>();

savedObjects.Add("member1", member1);
savedObjects.Add("member2", member2);
savedObjects.Add("member3", member3);
savedObjects.Add("member4", member4);   

var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() };
var saveData = JsonConvert.SerializeObject(savedObjects, settings);

// DeSerializing the Dictionary
Dictionary<string, dynamic> loadedObjects = new Dictionary<string, dynamic>();
loadedObjects = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(saveData);

member1 = loadedObjects["member1"]; // Giving an error: Cannot implicitly convert type 'Newtonsoft.Json.Linq.JObject' to 'PartyCreator.Member'

// These are the settings i'm using with Json Serializer
public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                    .Select(p => base.CreateProperty(p, memberSerialization))
                    .Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                    .Select(f => base.CreateProperty(f, memberSerialization)))
                    .Where(p => !p.PropertyName.Contains("k__BackingField"))
                    .ToList();
            props.ForEach(p => { p.Writable = true; p.Readable = true; });
            return props;
    }
}

0 个答案:

没有答案
相关问题