【问题标题】:How do I convert a JSON object into a dictionary with Path being the key如何将 JSON 对象转换为以 Path 为键的字典
【发布时间】:2015-03-01 04:41:29
【问题描述】:

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

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

  ... magic ...

  return Result;
}

字典的键应为 JToken.Path 值,字典的值应为其“本机”格式的实际值(字符串为字符串,整数为长整数等)。

"message.body.titles[0].formats[0].images[0].uri" => "I/41SKCXdML._SX160_SY120_.jpg" "message.body.titles[0].formats[0].images[0].widthPx" => 0 “message.body.titles[0].customerReviewsCollectionIncluded”=> 假 ...

有什么开箱即用的东西适用于任意 JSON 吗?

【问题讨论】:

  • 我不认为有任何开箱即用的东西可以做到这一点。您确定 JToken.Path 是唯一的,以便您可以将其用作键吗?
  • @Jacob - 我不认为这是重复的。该答案不会处理数组,并使用稍微不同的方案来定义关键文本。

标签: c# json json.net


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多