【问题标题】:XPath to read array elements from JSON stringXPath 从 JSON 字符串中读取数组元素
【发布时间】:2013-12-10 05:43:48
【问题描述】:

我的 JSON 输出字符串采用以下结构。

{
    "Results": [
        { "Result": 5756 },
        { "Result": 5234 },
        { "Result": 5432 }
    ]
}

由此,我想访问“结果”数组的每个元素(一个接一个 - 5756、5234、5432)。

为了读取/提取元素,我使用“XPath”。我尝试了很多 XPath,但到目前为止都没有运气;以下是其中的几个。

  1. //*[1].Result -- 无效的xPath
  2. //*[1].Result[0] -- 无效的xPath
  3. //*[1]/Result[0] -- NULL
  4. //*[1]/结果 -- NULL

当使用 //*[1] 时,它会给出整个 JSON 字符串,如下所示。

[
    { "Result": 5756 },
    { "Result": 5234 },
    { "Result": 5432 }
]

您能帮我解决我面临的问题吗? 或者 如果需要更改 JSON 的结构,建议我使用新结构以及 XPath 来访问数组元素,示例将不胜感激。

非常感谢。

【问题讨论】:

  • 叫我疯了,但 XPath 不只限于解析 XML 文档吗?
  • 您也可以使用 XPath 解析 JSON。 goessner.net/articles/JsonPath 看看这个。
  • 那不是 XPath,那是 JSONPath
  • 我很确定你不能(很高兴被证明是错误的)。如果您使用的是 JSONPath,请相应地标记此问题(即删除 xpath 标记)
  • 您实际使用什么工具来执行提取操作?

标签: xml json xpath jsonpath


【解决方案1】:

这是一个使用 jsonpath gem (http://rubygems.org/gems/jsonpath) 在 Ruby 中执行此操作的示例:

requre 'json'
require 'jsonpath'

# I initialize the data inline here, but you can read it from file
data = <<-EOS
{
  "Results": [
    { "Result": 5756 },
    { "Result": 5234 },
    { "Result": 5432 }
   ]
}
EOS

json_data = JSON.parse(data)

# First value:
JsonPath.new("$.Results[0].Result").on(json_data) # => 5756

# Second value:
JsonPath.new("$.Results[1].Result").on(json_data) # => 5234

# Third value:
JsonPath.new("$.Results[2].Result").on(json_data) # => 5432

【讨论】:

    【解决方案2】:

    @Popeye - 我最近发布了一个 JS 库的第一个版本,它完全符合您的要求; DefiantJS (http://defiantjs.com)

    使用这个库,您可以使用完整的 XPath 语法查询任何 JSON 结构。您还可以在此处使用 XPath 求值器立即测试/验证 XPath 表达式:

    http://www.defiantjs.com/#xpath_evaluator

    至于您的示例,假设您的结果数据与您举例说明的一样简单,我建议使用这样的 JSON 结构:

    var res = {
        "Results": [
              5756,
              5234,
              5432
        ]
    }
    

    并且使用 XPath 评估器(并查看浏览器上的控制台以获取提示),您可以使用此 XPath 提取所需的选择:

    var sel = Defiant.search(res, '//Results');
    // sel contains the array -> [5276, 5234, 5432]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多