C# 如何将字段映射到子对象

C# 如何将字段映射到子对象,c#,json.net,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; } } 如

假设我有一个平面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);
var obj=JsonConvert.DeserializeObject(json);

首先,您必须修复A中的属性名称,以便反序列化程序知道FIeld2映射到B:

public class A
{
    public string Field1 { get; set; }
    [JsonProperty("Field2")]
    public B B { get; set; }
}
然后您必须以某种方式定义从
字符串
值(“值”)到
B
对象的转换。您可以定义转换运算符:

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

    public string Field2 { get; set; }
}
或者,如果不需要,您可以定义自定义值转换器(简单的概念证明):

公共类BConverter:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器,B值,JsonSerializer序列化程序)
{
抛出新的NotImplementedException();
}
公共重写B ReadJson(JsonReader阅读器,类型objectType,B existingValue,bool hasExistingValue,JsonSerializer序列化程序)
{
字符串s=读取器。值为字符串;
返回新的B(){Field2=s};
}
}

。。。并将转换器应用于
A
B
属性:
[JsonConverter(typeof(BConverter))]

类结构和JSON结构不能在这里匹配的原因是什么?也许您可以反序列化为与数据结构匹配的中间对象,然后编写代码将该对象转换为所需的对象结构?或者可以将
Field2
添加到
A
中,然后您可以将
B
添加为计算属性?好的。。。但是如果他也将json
Field3
映射到
B
Field3
,那该怎么办?@Selvin很好,在这种情况下,您的具有转发属性的答案将获胜。如果json上不存在Field2,则这具有不创建B对象的优势,等等(考虑将字符串映射到自定义单位类型,例如
“length”:“3cm”
)这两种方法都非常适合某些用例imho.hmm我想知道我们是否可以对同一属性多次使用
JsonProperty
。。。还有
ReadJson
中的
B existingValue
参数是什么。。。我没有读过文档,但也许可以用
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 };
    }
}