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数据形状的类型。如果您希望使用不同的形状,请为此创建一个新类型并相应地映射。