【问题标题】:Filter json properties by name using JSONPath使用 JSONPath 按名称过滤 json 属性
【发布时间】:2018-09-25 16:39:57
【问题描述】:

我想选择属性名称中具有特定匹配项的所有元素。

例如,此json中名称以'pass'开头的所有属性:

{
  "firstName": "John",
  "lastName" : "doe",
  "age"      : 50,
  "password" : "1234",
  "phoneNumbers": [
    {
      "type"  : "iPhone",
      "number": "0123-4567-8888",
      "password": "abcd"
    },
    {
      "type"  : "home",
      "number": "0123-4567-8910",
      "password": "fghi"
    }
  ]
}

会产生这样的结果:

[
  "1234",
  "abcd",
  "fghi"
]

我不想按值过滤,只按属性名称。可以使用jsonpath吗?

我用的是Newtonsoft.Json.Linq的SelectTokens(string path)方法

【问题讨论】:

  • 看起来不行,root.SelectTokens("..pass*") 不起作用,请参阅dotnetfiddle.net/3vJl8y。我能找到的最接近的是数组切片运算符root.SelectTokens("..['password','pass']"),请参阅dotnetfiddle.net/QozjnQ。否则,您可以使用DescendantsAndSelf(),如图所示herehere

标签: json json.net jsonpath


【解决方案1】:

,JSONPath 定义表达式以遍历 JSON 文档以到达 JSON 的子集。当您不知道确切的属性名称时,不能使用它。

在您的情况下,您需要名称以特定关键字开头的属性值。为此,您需要遍历整个 JSON 文本并查找以 pass 开头且具有 string 类型

的属性名称
var passwordList = new List<string>(); 
using (var reader = new JsonTextReader(new StringReader(jsonText)))
{
    while (reader.Read())
    {
        if(reader.TokenType.ToString().Equals("PropertyName") 
           && reader.ValueType.ToString().Equals("System.String")
           && reader.Value.ToString().StartsWith("pass"))
        {
            reader.Read();
            passwordList.Add(reader.Value.ToString());
        }
    }
    passwordList.ForEach(i => Console.Write("{0}\n", i));
}

【讨论】:

  • 我用动态变量实现了一个解决方案,但这似乎更有效。
猜你喜欢
  • 2010-09-25
  • 2021-12-18
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多