我正在尝试动态查找事先不知道其结构的JSON对象的叶节点的名称.首先,我将字符串解析为JTokens列表,如下所示:
string req = @"{'creationRequestId':'A',
'value':{
'amount':1.0,
'currencyCode':'USD'
}
}";
var tokens = JToken.Parse(req);
然后,我想确定哪些是叶子.在上面的示例中,“ creationRequestId”:“ A”,“ amount”:1.0和“ currencyCode”:“ USD”是叶子,名称是creationRequestId,金额和currencyCode.
尝试有效,但略显丑陋
下面的示例以递归方式遍历JSON树并显示叶子名称:
public static void PrintLeafNames(IEnumerable 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());
}
}
这可行,打印:
creationRequestId
amount
currencyCode
但是,我想知道是否有一个不太丑的表达式来确定JToken是否是叶子:
bool isLeaf = token.Children().Count() == 1 && !token.Children().First().Children().Any();
解决方法:
似乎您已将叶子定义为任何JProperty,其值没有任何子值.您可以使用JToken上的HasValues属性来帮助确定:
public static void PrintLeafNames(IEnumerable 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());
}
}
标签:json-net,json,c
来源: https://codeday.me/bug/20191027/1945301.html