C# 如何将字段映射到子对象
假设我有一个平面JSON文档,如下所示: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; } } 如
{
"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
添加为计算属性?好的。。。但是如果他也将jsonField3
映射到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 };
}
}