我试图动态查找JSON对象的叶节点的名称,该对象的结构事先未知。首先,我将字符串解析为一个JToken列表,如下所示:
string req = @"{'creationRequestId':'A',
'value':{
'amount':1.0,
'currencyCode':'USD'
}
}";
var tokens = JToken.Parse(req);
然后我想确定哪些是叶子。在上面的示例中,'creationRequestId':'A'
、'amount':1.0
和'currencyCode':'USD'
是叶子,并且名称是creationRequestId
、amount
和currencyCode
。
尝试有效,但有点难看
以下示例递归遍历JSON树并打印叶名称:
public static void PrintLeafNames(IEnumerable<JToken> tokens)
{
foreach (var token in tokens)
{
bool isLeaf = token.Children().Count() == 1 && !token.Children().First().Children().Any();
if (token.Type == JTokenType.Property && isLeaf)
{
Console.WriteLine(((JProperty)token).Name);
}
if (token.Children().Any())
PrintLeafNames(token.Children<JToken>());
}
}
这个工作,打印:
creationRequestId
amount
currencyCode
然而,我想知道是否有一个不那么丑陋的表达式来确定JToken是否是叶子:
bool isLeaf = token.Children().Count() == 1 && !token.Children().First().Children().Any();
顺便说一句,这是XML中的一行代码。
看起来您已经将叶定义为任何值没有任何子值的JProperty
。您可以使用JToken
上的HasValues
属性来帮助进行此确定:
public static void PrintLeafNames(IEnumerable<JToken> tokens)
{
foreach (var token in tokens)
{
if (token.Type == JTokenType.Property)
{
JProperty prop = (JProperty)token;
if (!prop.Value.HasValues)
Console.WriteLine(prop.Name);
}
if (token.HasValues)
PrintLeafNames(token.Children());
}
}
Fiddle:https://dotnetfiddle.net/e216YS