如何将 JSON 对象转换为以 Path 为键的字典
How do I convert a JSON object into a dictionary with Path being the key
如何使用 Newtonsoft.Json 将 JSON 对象转换为以 Path 为键的字典?
IDictionary<string, object> FlattenJson(string Json)
{
JToken Input = JToken.Parse(Json);
... magic ...
return Result;
}
字典的键应为 JToken.Path 值,字典的值应为其 "native" 格式的实际值(字符串为字符串,整数为 long 等)。
"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 的开箱即用的东西?
您需要递归遍历 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
。
如何使用 Newtonsoft.Json 将 JSON 对象转换为以 Path 为键的字典?
IDictionary<string, object> FlattenJson(string Json)
{
JToken Input = JToken.Parse(Json);
... magic ...
return Result;
}
字典的键应为 JToken.Path 值,字典的值应为其 "native" 格式的实际值(字符串为字符串,整数为 long 等)。
"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 的开箱即用的东西?
您需要递归遍历 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
。