XPath从JSON字符串中读取数组元素

时间:2013-12-10 05:43:48

标签: xml json xpath jsonpath

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

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

由此,我想访问“Results”数组的每个元素(逐个 - 5756,5234,5432)。

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

  1. // * [1] .Result - 无效的xPath
  2. // * [1] .Result [0] - 无效的xPath
  3. // * [1] / Result [0] - NULL
  4. // * [1] /结果 - NULL
  5. 当使用 // * [1] 时,它会提供如下的整个JSON字符串。

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

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

    非常感谢提前。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

使用此lib,您可以使用fullscale 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]