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

本文关键字:Path 字典 转换 JSON 对象 | 更新日期: 2023-09-27 18:36:03

使用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].format[0].images[0].widthPx" => 0"message.body.titles[0].customerReviewsCollectionInclude" => False...

是否有适用于任意 JSON 的开箱即用?

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

您需要

递归遍历 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