想象一下,我有一个类似这样的课程:
public class Foo
{
[JSonProperty("a")]
public int a;
[JSonProperty("b")]
public int b;
public List<Foo> foos;
}
并想象我有一个像这样的Json:
{
"a": "0",
"b": "1",
"moreFoos": {
"total" : "2",
"foos" : [
{
"a" : "2",
"b" : "3"
},
{
"a" : "4",
"b" : "5"
}
]
}
}
所以,我想要做的是用JsonConvert.DeserializeObject(Foo)反序列化所有属性,但是现在只反序列化“a”和“b”。我试图在foos属性上添加这样的东西:
[JsonProperty("moreFoos.foos")]
public List<Foo> foos;
但它不起作用,foos为null。你知道是否有办法以这种方式动态映射属性?当然,我想避免创建一个名为“total”的int属性的新类,另一个名为foos的新类作为Foo对象列表。
此致 罗曼。
答案 0 :(得分:0)
一种可能性是在私有嵌套代理类型中序列化列表,如下所示:
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);
}
}
}
(我使用包装结构而不是类来避免ObjectCreationHandling
设置为Reuse的问题,其中代理包装类在获取后永远不会被设置回来填写。)
另一种选择是使用JsonConverter
动态重构您的数据,沿着Can I serialize nested properties to my class in one operation with Json.net?行,但因为您的类是递归的而进行了调整。