将链接集反序列化为字典

时间:2017-07-25 17:00:35

标签: json json.net

我试图反序列化REST API调用的输出。 JSON的一个片段在这里:

    "_links": {
        "invoices": {
            "href": "url",
            "type": "application/json"
        },
        "members": {
            "href": "otherurl",
            "type": "application/json"
        },
        "paymentCard": {
            "href": "yetanotherurl",
            "type": "application/json"
        },
        "self": {
            "href": "evenmoreurl",
            "type": "application/json"
        },
        "session": {
            "href": "andyesevenmoreurl",
            "type": "application/json"
        },
        "subscription": {
            "href": "tiredofurls",
            "type": "application/json"
        }
    }

我想将它反序列化为以下类的字典:

public class Link
{
    public string Name {get; set;}
    public string Href {get; set;}
    public string Type {get; set;}
}

字典将是

Dictionary<string, Link> = new Dictionary<string, Link>();

其中Name属性是键

我试图使用Newtonsoft的JSON Serializer。

这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

是的,你可以像这样得到你想要的字典:

Dictionary<string, Link> dict = JObject.Parse(json)
    .SelectToken(".._links")
    .Children<JProperty>()
    .ToDictionary(jp => jp.Name, jp => new Link()
    {
        Name = jp.Name,
        Href = (string)jp.Value["href"],
        Type = (string)jp.Value["type"]
    });

在这里,我使用Json.Net的LINQ-to-JSON API将JSON解析为JObject。我使用SelectToken方法和JsonPath expression递归地找到名为&#34; _links&#34;的第一个节点。 JSON中的任何地方。从那里,我得到子属性并将其转换为您所描述的链接字典。

小提琴:https://dotnetfiddle.net/HBjm51