将Json数据解析为自定义对象C#

时间:2017-08-24 16:11:05

标签: c# json json.net

我有一个Json结构,见下面的代码。

"attributes": {
    "13448": {
        "id": 13448,
        "name": {
            "sv": "H\u00f6jd",
            "en": "Length",
            "nb": "Lengde",
            "de": "",
            "da": "L\u00e6ngde",
            "fi": "Pituus"
        },
        "value": {
            "sv": "Sanderson",
            "en": "Sanderson",
            "nb": "Sanderson",
            "de": null,
            "da": "Sanderson",
            "fi": "Sanderson"
        }
    },
    "13910": {
        "id": 13910,
        "name": {
            "sv": "H\u00f6jd",
            "en": "Length",
            "nb": "Lengde",
            "de": "",
            "da": "L\u00e6ngde",
            "fi": "Pituus"
        },
        "value": {
            "sv": "50s Collection",
            "en": "50s Collection",
            "nb": "50s Collection",
            "de": null,
            "da": "50s Collection",
            "fi": "50s Collection"
        }
    }
}

我想序列化为一个自定义对象,我只希望将 name 的值作为字典中的键。 并将存储为该字典中的值。

Key      | Value   |
--------------------
H\u00f6jd|Sanderson|
Length   |Sanderson|

所以我的代码目前是:

foreach(var item in obj["attributes"])
{
     var attribute = item.First["name"].ToObject<ArticleAttributes>();
     var attribute = item.First["value"].ToObject<ArticleAttributes>();
}

我的ArticleAttributes类看起来像:

public class ArticleAttributes
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("value")]
    public string value { get; set; }
}

1 个答案:

答案 0 :(得分:1)

如果不为特定情况编写 json转换器,最接近的是:

var res = JsonConvert.DeserializeObject<RootObject>(json);

public class Item
{
    public int Id { get; set; }
    public Dictionary<string,string> Name { get; set; }
    public Dictionary<string, string> Value { get; set; }
}


public class RootObject
{
    public Dictionary<string, Item> Attributes { get; set; }
}

您可以进一步处理结果。

var finalres = res.Attributes
                    .ToDictionary(
                        x => x.Value.Id, 
                        x => x.Value.Value.Keys
                              .ToLookup(y => x.Value.Name[y], y => x.Value.Value[y]));

现在您可以将其用作:

var val = finalres[13448]["Lengde"].FirstOrDefault();