【问题标题】:How to run JSONiq from JSON with try.zorba.io如何使用 try.zorba.io 从 JSON 运行 JSONiq
【发布时间】:2019-03-15 11:50:03
【问题描述】:

我需要编写一个 JSONiq 表达式,它只列出价格至少为 3 的产品的名称。这是我在 XQuery 部分中输入的 JSON 文件:

{ "supermarket_visit":{
        "date":"08032019",
        "bought":[
            "item",{
                "type":"confectionary",
                "item_name":"Kit_Kat",
                "number": 3,
                "individual_price": 3.5
                },
            "item",{
                "type":"drinks",
                "item_name":"Coca_Cola",
                "number": 2,
                "individual_price": 3
                },
            "item",{
                "type":"fruits",
                "item_name":"apples",
                "number": "some"
                }
            ], 
"next_visit":[
            "item",{
                "type":"stationary",
                "item_name":"A4_paper",
                "number": 1
                },
            "item",{
                "type":"stationary",
                "item_name":"pen",
                "number": 2
                }
            ]
        }
}

这是我的 JSONiq Xquery JSONiq 命令,我真的不知道在哪里输入try.zorba.io

let $x := find("supermarket_visit")
for $x in $supermarket.bought let $i := $x.item
where $i.individual_price <=3
return $i.item_name

我在 try.zorba.io 中遇到了很多错误,而且我对 JSONiq 和 JSON 真的很陌生。我的 JSON 或 JSONiq 部分有问题吗?

【问题讨论】:

  • 请注意,不幸的是,在 XQuery 3 之后,JSON 支持的合并导致了两种方法,JSONiq 和 XPath 3.1/XQuery 3.1,在 W3C 标准 XQuery 3.1 中,选择将是 ?supermarket_visit?bought?*[. instance of map(*) and ?individual_price &lt;= 3]?item_name,请参阅 xqueryfiddle.liberty-development.net/gWcDMeq .
  • 事实上,JSONiq 和 XQuery 3.1 已经过优化以涵盖互补的用例(纯 JSON 查询与高效的内存映射 + 数组结构)。此处记录了差异:stackoverflow.com/questions/44919443/…

标签: json xquery jsoniq


【解决方案1】:

在您链接到的网站上,以下选择对我有用:

jsoniq version "1.0";
{ "supermarket_visit":{
        "date":"08032019",
        "bought":[
            "item",{
                "type":"confectionary",
                "item_name":"Kit_Kat",
                "number": 3,
                "individual_price": 3.5
                },
            "item",{
                "type":"drinks",
                "item_name":"Coca_Cola",
                "number": 2,
                "individual_price": 3
                },
            "item",{
                "type":"fruits",
                "item_name":"apples",
                "number": "some"
                }
            ],
"next_visit":[
            "item",{
                "type":"stationary",
                "item_name":"A4_paper",
                "number": 1
                },
            "item",{
                "type":"stationary",
                "item_name":"pen",
                "number": 2
                }
            ]
        }
}.supermarket_visit.bought()[$$ instance of object and $$.individual_price le 3].item_name

【讨论】:

    【解决方案2】:

    原始查询可以稍微修改为(以保持 FLWOR 表达式):

    jsoniq version "1.0";
    
    let $document := { (: put the document here :) }
    for $x in $document.supermarket_visit.bought[]
    where $x instance of object and $x.individual_price le 3
    return $x.item_name
    

    请注意,try.zorba.io 是 Zorba (2.9) 的旧版本,它没有实现最新的稳定 JSONiq 版本。这就是为什么在此特定页面上必须使用 () 而不是 [] 的原因。如果您下载最新版本的 Zorba,上述查询应该可以工作。

    此外,问题中提供的原始文档不是格式正确的 JSON,因为它在“next_visit”上方的行中包含一个特殊的 em 空格字符(Unicode 2003)。必须删除此字符才能成功解析此 JSON。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-09
      • 1970-01-01
      相关资源
      最近更新 更多