3

我在以下结构中有 JSON 输出字符串。

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

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

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

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

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

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

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

提前谢谢了。

4

2 回答 2

2

这是一个使用 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
于 2013-12-11T07:38:41.393 回答
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]
于 2014-01-03T11:46:46.760 回答