首页 > 解决方案 > 将 JSON 反序列化为不同的对象结构

问题描述

我确定有人问过这个问题,但我找不到它,可能是因为我不知道它的条款是什么。假设我有以下内容:

JSON

{
    "Field1": 1234,
    "Field2": 5678,
    "MoreData": {
        "Field3": 9012,
        "Field4": 3456
    },
   "Field5": "Test"
}

班级

public class Sample()
{
    public int Field1 { get; set; }
    public int Field2 { get; set; }
    public int Field3 { get; set; }
    public int Field4 { get; set; }
    public string Field5 { get; set; }
}

如果我反序列化此 Field1、Field2 和 Field5 将被填充,但有没有办法让 Field3 和 Field4 也以简单的方式填充。

我不想为 Field2 和 Field3 提供公共类 MoreData。

标签: c#jsondeserialization

解决方案


如果您无法更改模型,请尝试以下操作:

public class SampleContractResolver : DefaultContractResolver
{
    private Dictionary<string, string> PropertyMappings { get; set; }

    public CustomContractResolver()
    {
        this.PropertyMappings = new Dictionary<string, string> 
        {
            {"Field3", "MoreData.Field3"},
            {"Field4", "MoreData.Field4"},
        };
    }

    protected override string ResolvePropertyName(string propertyName)
    {
        string resolvedName = null;
        var resolved = this.PropertyMappings.TryGetValue(propertyName, out resolvedName);
        return (resolved) ? resolvedName : base.ResolvePropertyName(propertyName);
    }
}

并像这样使用它:

var sample = JsonConvert.DeserializeObject<Sample>(json, new JsonSerializerSettings(){
        ContractResolver = new SampleContractResolver()
    });

推荐阅读