如何在不在C#JSON中创建对象的新实例的情况下反序列化对象?

时间:2017-06-01 06:58:59

标签: c# json deserialization

我想将json字符串反序列化到我的对象而不创建我的对象的新实例,因为我在启动应用程序时加载了我的对象而我只想要我的类的更新属性而不想在使用json时创建新实例反序列化。

示例普通json deserialer在此示例中正常工作,这将创建对象的新实例:

var obj = JsonConvert.DeserializeObject<MyData>("json string to deserialize");

在我的情况下,我有一个对象的实例,我想反序列化并将属性映射到我的对象:

    MyData data = new MyData() { Age = 27, Name = "Ali" };
    //this is my case what I want:
    JsonConvert.DeserializeObject("json string to deserialize and mapp", ref data);
    //or:
    JsonConvert.DeserializeObject("json string to deserialize and mapp", data);

1 个答案:

答案 0 :(得分:0)

这是一个有趣的问题。 怎么样:

    var data = new MyData() { Age = 27, Name = "Ali" };
    var dataType = typeof(MyData);
    var obj = JsonConvert.DeserializeObject<MyData>(richTextBox1.Text);

    var binding = BindingFlags.Instance | BindingFlags.Public;
    var properties = obj.GetType().GetProperties(binding);
    foreach (var property in properties)
    {
        if (!property.CanRead)
            continue;

        var value = property.GetValue(obj);

        if (ReferenceEquals(value, null))
            continue;

        dataType.GetProperty(property.Name).SetValue(data, value);
    }

注意: JsonConvert.PopulateObject()覆盖现有属性。在我的解决方案中退出属性不会覆盖。