C# Json:如何映射特定属性?
想象一下,我有一个这样的班级:C# Json:如何映射特定属性?,c#,json,json.net,C#,Json,Json.net,想象一下,我有一个这样的班级: public class Foo { [JSonProperty("a")] public int a; [JSonProperty("b")] public int b; public List<Foo> foos; } { "a": "0", "b": "1", "moreFoos": { "total" : "2", "foos" : [ { "
public class Foo
{
[JSonProperty("a")]
public int a;
[JSonProperty("b")]
public int b;
public List<Foo> foos;
}
{
"a": "0",
"b": "1",
"moreFoos": {
"total" : "2",
"foos" : [
{
"a" : "2",
"b" : "3"
},
{
"a" : "4",
"b" : "5"
}
]
}
}
所以,我想做的是用JsonConvert.DeserializeObjectFoo反序列化所有属性,但现在只有a和b被反序列化。我曾尝试在foos财产上放置类似的内容:
[JsonProperty("moreFoos.foos")]
public List<Foo> foos;
但它不起作用,foos是空的。您知道有没有一种方法可以通过这种方式动态映射属性?当然,我希望避免创建一个新类,该类使用名为total的int属性和另一个名为foos的属性作为Foo对象列表
问候,,
Román.一种可能性是以私有嵌套代理类型序列化列表,如下所示:
public class Foo
{
struct ListWrapper<T>
{
public int total { get { return (foos == null ? 0 : foos.Count); } }
[JsonProperty(DefaultValueHandling=DefaultValueHandling.Ignore)]
public List<T> foos { get; set; }
public ListWrapper(List<T> list) : this()
{
this.foos = list;
}
}
[JsonProperty("a")]
public int a;
[JsonProperty("b")]
public int b;
[JsonIgnore]
public List<Foo> foos;
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
ListWrapper<Foo>? moreFoos
{
get
{
return foos == null ? null : (ListWrapper<Foo>?)new ListWrapper<Foo>(foos);
}
set
{
foos = (value == null ? null : value.Value.foos);
}
}
}
我使用包装器结构而不是类来避免设置为的问题,在这个问题中,代理包装器类在获取和填充之后永远不会被设置回
另一种选择是使用动态重组数据,按照的行,但由于类是递归的,所以进行了调整。我只能在这里考虑使用动态:JsonConvert.DeserializeObjectFoo,然后使用方法将动态转换为对象。否则,您可以使用IMO,您应该创建一个直接映射到json数据形状的类型。如果您希望使用不同的形状,请为此创建一个新类型并相应地映射。