【问题标题】:Search List of JTokens for text value在 JToken 列表中搜索文本值
【发布时间】:2017-12-15 06:38:13
【问题描述】:

我有一个 JToken 列表,我需要确定是否有任何令牌包含某个值。例如,我需要知道令牌列表中是否包含单词“Checking”。列表中的第一个 JToken 包含值“Checking 11010000”。

以下是一些实际编译的尝试。

var test1 = testlist.FirstOrDefault( i => i.Contains( "Checking" ) ); // returns null
var test2 = testlist.Any( x => x.Contains( "Checking" ) ); // returns false
var test3 = testlist.TrueForAll( x => x.Contains( "Checking" ) ); // returns false
var test4 = testlist.TrueForAll( x => x.Children().Contains( "Checking" ) ); // returns false
var test5 = testlist.Any( x => x.Children().Contains( "Checking" ) ); // returns false
var test6 = testlist.All( x => x.Children().Contains( "Checking" ) ); // returns false
var test7 = testlist.Find( x => x.Contains( "Checking" ) ); // returns null

如何在不迭代列表和检查每个令牌的情况下搜索 JToken 列表中的值?

更新:

以下是相关 JSON 源代码的片段:

    {
       ...
       "Rows":{
          "Row":[
             {
                "ColData":[
                   {
                      "value":"Checking 11010000",
                      "id":"35"
                   },
                   {
                      "value":"232.40"
                   },
                   {
                      "value":""
                   }
                ]
             },
             {
                "ColData":[
                   {
                      "value":"Savings 11020000",
                      "id":"36"
                   },
                   {
                      "value":"800.00"
                   },
                   {
                      "value":""
                   }
                ]
             }
    ...
    }

这就是我的列表的声明方式

var testlist = PriorMonth.SelectTokens( "$..ColData[*].value" ).ToList();

这给了我一个看起来像的列表

【问题讨论】:

  • 1) 为什么要搜索列表而不迭代列表和检查每个标记?你是什​​么意思? 2)你能提供一个minimal reproducible example吗? 3) 标记是原子JValue 值还是它们可以是搜索词深度嵌套的容器?
  • 嗯,基本上我有两个列表,我想知道一个列表是否包含另一个列表中的值。如果两个列表都包含值,我们将执行一项操作,如果两个列表都不包含值,我们将执行另一项操作。
  • 能否在您的示例代码中提供 testlist 的定义。
  • 当然,我添加了一些更新@DylanNicholson
  • 如何访问单个JToken的字符串值?

标签: c# linq json.net


【解决方案1】:

您需要测试每个JToken 的值,而不是IEnumerable<JToken> 的内容,其中Contains 比较匹配的JToken

var hasChecking = testlist.Any(jt => jt.Value<string>().Contains("Checking"));

【讨论】:

  • 感谢@NetMage。使用您发布的内容,我能够让事情正常进行!
猜你喜欢
  • 2013-06-27
  • 2015-03-11
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多