C#在JSON中反序列化列表

时间:2014-11-24 18:59:42

标签: c# json deserialization

假设我有这样的JSON,我如何为反序列化建模我的类?

我对标准属性(如“虚拟”或普通数组)的模型类没有任何问题,但在这种情况下,我的“链接”数组是具有不同名称的项目列表(“插件”,“条件”,“转换” “等等)。

"dummy": "1",
 "links": {
            "addons": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/offers/031C9E47-4802-4248-838E-778FB1D2CC05/addons",
                "method": "GET"
            },
            "conditions": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/offers/031C9E47-4802-4248-838E-778FB1D2CC05/conditions",
                "method": "GET"
            },
            "conversions": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/offers/031C9E47-4802-4248-838E-778FB1D2CC05/conversions",
                "method": "GET"
            },
            "list_prices": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/offers/031C9E47-4802-4248-838E-778FB1D2CC05/list-prices",
                "method": "GET"
            },
            "mutual_exclusion": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/offers/031C9E47-4802-4248-838E-778FB1D2CC05/mutually-exclusive-offers",
                "method": "GET"
            },
            "prerequisites": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/offers/031C9E47-4802-4248-838E-778FB1D2CC05/prerequisites",
                "method": "GET"
            },
            "product": {
                "href": "/16071d9f-efec-4282-a42e-a495eea76ae0/products/f245ecc8-75af-4f8e-b61f-27d8114de5f3",
                "method": "GET"
            }
        },

2 个答案:

答案 0 :(得分:2)

假设您正在寻找LinkTypes的集合(如果愿意的话),在您的JSON中,您是否可以使用以下内容,并执行Deserialize上的RootObject?< / p>

使用dotNet小提琴:https://dotnetfiddle.net/ZWSlK4

查看小提琴页面上控制台窗格的输出。

public class Link
{
    public string Href { get; set; }
    public string Method { get; set; }
}

public class Links
{
    [JsonProperty("addons")]
    public Link Addons { get; set; }
    [JsonProperty("conditions")]
    public Link Conditions { get; set; }
    [JsonProperty("conversions")]
    public Link Conversions { get; set; }
    [JsonProperty("list_prices")]
    public Link ListPrices { get; set; }
    [JsonProperty("mutual_exclusion")]
    public Link MutualExclusion { get; set; }
    [JsonProperty("prerequisites")]
    public Link Prerequisites { get; set; }
    [JsonProperty("product")]
    public Link Product { get; set; }
}


public class RootObject
{
    public string dummy { get; set; }
    public Links links { get; set; }
}

然后像这样执行Deserializer

var myDummyLinksList = JsonConvert.DeserializeObject<RootObject>(jsonText);

其中jsonText包含您在示例中列出的json字符串:

但是,如果Listlinks个对象是动态的并且内部对象的数量不同而您需要捕获所有这些对象,那么则可能需要编写自定义转换器继承自JsonConverter对象。然后使用the answer发布的@mfarouk

我分叉了我的dotNet小提琴并实施了他的解决方案,它就像动态案例的老板一样!

工作dotNet小提琴(动态案例):https://dotnetfiddle.net/7bFcNM

希望这有帮助!

答案 1 :(得分:1)

links属性可以解析为键值字典,类可以像

public class JSONClass
{
    public string dummy { get; set; }
    public Dictionary<string, Link> links;

    public class Link
    {
        public string Href { get; set; }
        public string Method { get; set; }
    }
}

然后反序列化为

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JSONClass>(JSON);