如何将字段映射到子对象

时间:2018-11-07 12:42:55

标签: c# json.net

说我有一个像这样的平面JSON文档:

{
    "Field1": "Value",
    "Field2": "Value"
}

并想将其反序列化为自定义对象A,其中Field2位于子对象B上:

public class A
{
    public string Field1 { get; set; }
    public B B { get; set; }
}

public class B
{
    public string Field2 { get; set; }
}

如何配置Newtonsoft JSON来处理此问题?

var obj = JsonConvert.DeserializeObject<A>(json);

1 个答案:

答案 0 :(得分:1)

首先,您必须在A中修复属性名称,以便解串器知道FIeld2映射到B:

public class A
{
    public string Field1 { get; set; }
    [JsonProperty("Field2")]
    public B B { get; set; }
}

然后,您必须以某种方式定义string值(“ Value”)到B对象的转换。您可以定义一个转换运算符:

public class B
{
    public static explicit operator B(string source)
    {
        return new B(){Field2 = source};
    }

    public string Field2 { get; set; }
}

或者,如果不希望这样,您可以定义一个自定义值转换器(简单的概念证明):

public class BConverter : JsonConverter<B>
{
    public override void WriteJson(JsonWriter writer, B value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override B ReadJson(JsonReader reader, Type objectType, B existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        string s = reader.Value as string;
        return new B() { Field2 = s };
    }
}

...并将转换器应用于A的{​​{1}}属性:B