【问题标题】:How can I select some JSON object having name "forecast_XXX" using XPATH\JSONPATH?如何使用 XPATH\JSONPATH 选择一些名为“forecast_XXX”的 JSON 对象?
【发布时间】:2018-09-08 03:58:28
【问题描述】:

我不太喜欢 XPATH,但遇到以下问题。

我有这个 JSON 对象:

{
    "forecast_1": {
        "country": "Rwanda",
        "forecast_date": "2018-03-20",
        "province": "Kigali City",
        "district": "Kigali",
        "morning": {
            "min_temp": 14,
            "status": "Sun with right rain",
            "max_temp": 16,
            "humidity": "",
            "wind_direction": "",
            "wind_force": "",
            "description": "Lorem ipsum"
        },
        "afternoon": {
            "min_temp": 24,
            "status": "Dark cloud with rain",
            "max_temp": 28,
            "humidity": "",
            "wind_direction": "",
            "wind_force": "",
            "description": "Lorem ipsum"
        }
    },
    "forecast_2": {
        "country": "Rwanda",
        "forecast_date": "2018-03-25",
        "province": "Kigali",
        "district": "Kigali",
        "morning": {
            "min_temp": 21,
            "status": "Rain showers",
            "max_temp": 21,
            "humidity": "",
            "wind_direction": "",
            "wind_force": "",
            "description": "There will be heavy rain"
        },
        "afternoon": {
            "min_temp": 32,
            "status": "Rain showers",
            "max_temp": 32,
            "humidity": "",
            "wind_direction": "",
            "wind_force": "",
            "description": "There will be heavy rain with thunder"
        }
    }
}

如您所见,它包含 2 个由 forecast_XXX 标识的“根”对象(但可以超过 2 个),在特定情况下我有 forecast_1forecast_2

所以我可以有一个像这样的 JSON 对象的集合,但没有放在 JSON 数组中(它们来自外部 Web 服务,我不能将它们放在数组中)。

所以我需要一个 XPATH 表达式来标识所有这些 forecast_XXX 对象(这样我就可以尝试迭代这些对象,就好像这些对象在数组中一样)。

如何使用 XPATH 表达式选择所有这些 forecast_XXX 对象?我在哪里可以测试它? (它应该存在一些在线工具,我在其中放置 JSON 和 XPATH 表达式并获得输出)

【问题讨论】:

    标签: json xpath jsonpath


    【解决方案1】:

    要使用 XPath 选择 JSON 结构,您需要 XPath 3.1。 (我会给其他人留下一个 JsonPath 答案。)

    forecast_N 键的这种使用是一种不幸的数据设计方式,但可以这样处理:

    map:keys()[$json, matches('.', 'forecast_[0-9]+')]!map:get($json, .)
    

    假设$json 是使用parse-json()json-doc() 解析JSON 输入的结果。

    如果您的 XPath 3.1 引擎支持高阶函数,那么您也可以这样做

    map:for-each($json, 
        function($k, $v){$v[matches($k, 'forecast_[0-9]+')]})
    

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多