Newtonsoft.Json:我如何映射特定属性?

时间:2015-05-14 15:28:18

标签: c# json json.net

想象一下,我有一个类似这样的课程:

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对象列表。

此致 罗曼。

1 个答案:

答案 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?行,但因为您的类是递归的而进行了调整。