Xidel json xpath - 如何获得多个元素的价值

时间:2014-08-24 09:01:41

标签: json xpath xidel

需要使用Xidel从json数据中获取多个元素值。单个元素查询如:

xidel - -e 'jn:members(json($raw))("client_name")'

xidel - -e 'jn:members(json($raw))("amount")'

工作正常,但谷歌搜索很长时间,无法找到如何构建多个元素提取的表达式。以下尝试失败:

xidel - -e 'jn:members(json($raw))("client_name","amount")'
xidel - -e 'jn:members(json($raw))("client_name,amount")'
xidel - -e 'jn:members(json($raw))("client_name")("amount")'
xidel - -e 'jn:members(json($raw))[("client_name")("amount")]'

2 个答案:

答案 0 :(得分:1)

一些Xidel特定的东西(> = 0.8版本):

  1. 您不再需要json($raw)$json已足够

  2. 它有自己的JSON读取语法,更像是XPath而不是JSONiq:

    xidel - -e 'jn:members($json) / (client_name, amount)'
    

    或者像其他评论中提到的那样:

    xidel - -e 'string-join($json / (id, your_name, total), ",")'
    
  3. 在普通的JSONiq中,可以使用库函数:

      declare namespace libjn= "http://jsoniq.org/function-library"; 
      string-join(libjn:values(libjn:project($json, ("id", "your_name", "total"))), ",")
    

答案 1 :(得分:0)

我们需要查看您拥有的JSON以及您想要的输出的一些解释,无论您是要输出JSON还是XML或字符串。

这是一个适用于Xidel在线演示的示例:

let $data := [
  { "client_name": "Foo", "order": 1, "amount": 20 },
  { "client_name": "Bar", "order": 2, "amount": 30 }]
for $order in jn:members($data)
return $order("client_name") || ": " ||  $order("amount")

并返回(我认为)一系列字符串

Foo: 20
Bar: 30

如果要返回JSON对象的三个属性,则应该能够使用

let $obj := json($raw) return $obj("id") || ', ' || $obj("your_name") || ', ' || $obj("total")

如果您不想使用管道,请尝试

let $obj := json($raw) return concat($obj("id"), ", ", $obj("your_name"), ", ", $obj("total"))

基于命令行的评论

xidel - -e 'let $obj := json($raw) return concat($obj("id"), ", ", $obj("your_name"), ", ", $obj("total"))'

应该这样做。

甚至

xidel - -e "let $obj := json($raw) return $obj('id') || ', ' || $obj('your_name') || ', ' || $obj('total')"