如何将JSON对象转换为以Path为关键字的字典

时间:2015-01-02 22:00:19

标签: c# json json.net

使用Newtonsoft.Json如何将JSON对象转换为以字符为键的字典?

IDictionary<string, object> FlattenJson(string Json)
{
  JToken Input = JToken.Parse(Json);

  ... magic ...

  return Result;
}

字典的键应为JToken.Path值,字典的值应为其本地&#34;中的实际值。 format(字符串为字符串,整数为long等)。

&#34; message.body.titles [0] .formats [0] .images [0] .uri&#34; =&GT; &#34; I / 41SKCXdML._SX160_SY120_.jpg&#34; &#34; message.body.titles [0] .formats [0] .images [0] .widthPx&#34; =&GT; 0 &#34; message.body.titles [0] .customerReviewsCollectionIncluded&#34; =&GT;假 ...

是否存在适用于任意JSON的开箱即用的东西?

1 个答案:

答案 0 :(得分:1)

您需要以递归方式遍历Json.NET层次结构,选择原始值(类型为JValue),并将其值存储在字典中,如下所示:

public static class JsonExtensions
{
    public static IEnumerable<JToken> WalkTokens(this JToken node)
    {
        if (node == null)
            yield break;
        yield return node;
        foreach (var child in node.Children())
            foreach (var childNode in child.WalkTokens())
                yield return childNode;
    }

    public static IDictionary<string, object> ToValueDictionary(this JToken root)
    {
        return root.WalkTokens().OfType<JValue>().ToDictionary(value => value.Path, value => value.Value);
    }
}

然后将其称为

var Result = Input.ToValueDictionary();

请注意,整数将存储为Int64