当前位置: 首页 > 工具软件 > jtoken > 使用案例 >

jtoken判断是否包含键_c#-确定JToken是否为叶子

况弘新
2023-12-01

我正在尝试动态查找事先不知道其结构的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

 类似资料: