【问题标题】:Jayway JSONPath Expession for Both Object and Array对象和数组的 Jayway JSONPath Expession
【发布时间】:2020-08-08 17:45:40
【问题描述】:

如果父元素既可以是 JSONArray 也可以是 JSONObject,我在检索值时就会遇到麻烦。为此,我使用 Deepcopy 语法来检索它。现在的问题是,如果内部数组中也存在子属性,则会获得额外的值。

例如: JpathExpression:

$.store..book..innerBook..category

结果是:

[
   "innerReference1",
   "innerBook1Ref1",
   "innerReference2"
]

示例 1 预期结果是:

[
   "innerReference1",
   "innerReference2"
]

示例 1:

{
    "store": {
        "book": [
        {
                "innerBook": [
                    {
                        "category": "innerReference1",
                        "author": "Nigel Rees",
                        "innerBook1": [
                            {
                                "category": "innerBook1Ref1"
                            }
                        ]
                    },
                    {
                        "category": "innerReference2",
                        "author": "Nigel Rees"
                    }
                ]
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

示例 2:

{
    "store": {
        "book": [
        {
                "innerBook": 
                    {
                        "category": "innerReference1",
                        "author": "Nigel Rees",
                        "innerBook1": [
                            {
                                "category": "innerBook1Ref1"
                            }
                        ]
                    }
                
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

示例 2 预期结果是:

[
   "innerReference1"
]

【问题讨论】:

  • 它在示例 1 中运行良好......而对于示例 2......它也在检索 innerBook1 类别的值......但理想情况下它不应该。
  • 是...来自示例 1...InnerBook1.category 被忽略,但示例 2 InnerBook1.category 包含在响应中。
  • 两个示例都需要..只需要单独检索 InnerBook 类别,因为在 Jpath Expression InnerBook1 中未定义,因为 Deep copy 目前它也在提取 innerBook1 类别值的值,理想情况下不应该.我为两个示例添加了预期结果。请查看它,如果您找到任何解决方案,它将非常有帮助

标签: java json jsonpath json-path-expression jayway


【解决方案1】:

然而,有点晚了,我们不需要在innerBook 之后使用递归下降.. 来遍历数组中的项目;使用 Jayway,我们可以使用 innerBook[*].category 来检索所需的结果,例如 1:

$.store..book..innerBook[*].category

示例 2 需要删除数组访问器:

$.store..book..innerBook.category 

您不能在一个 JSON 中将 innerBook 作为数组和对象,因为它无效。

如果您有一个 API(或其他)提供具有数组或对象类型的 innerbook 属性的 JSON(这将是一个设计糟糕的 API,因为 API 的全部意义在于获得预期的响应),您可以根据innerBook1的存在查询两个路径或访问类别:

$.store.book..innerBook[?(@.innerBook1)]..category

仅返回两个示例

[
   "innerReference1",
   "innerBook1Ref1"
]

在线试用here

【讨论】:

  • 感谢您的回答,它适用于数组对象,但不适用于 Json 对象,而 innerBook 是对象而不是数组。您能否提供 Jpath 表达式来获取 jsonobject 和 jsonarray;
  • @MohammedAbdullah 很高兴听到有一些进展;你能提供一个更新的样本以避免混淆吗?
  • 添加了 JsonObject 示例,请您帮忙使用单个 Jpath 表达式检索值。
  • @MohammedAbdullah 这是一个理论问题还是你在某个地方使用它?
  • @MohammedAbdullah 正如所暗示的,我认为您需要运行两个查询来处理不同的输入。以下过滤器可以帮助您确定是否应使用查询 1 或 2:$.store..book..[?(@.innerBook[1].category empty false)]
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多