2

需要使用 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")]'
4

2 回答 2

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), ",")'
    

在普通 JSONiq 中,可以使用库函数:

  declare namespace libjn= "http://jsoniq.org/function-library"; 
  string-join(libjn:values(libjn:project($json, ("id", "your_name", "total"))), ",")
于 2014-08-24T16:53:14.797 回答
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')"
于 2014-08-24T10:22:36.363 回答