【问题标题】:JsonSlurper inconsistently parses Strings? Sometimes returns String, sometimes returns ArrayList?JsonSlurper 不一致地解析字符串?有时返回String,有时返回ArrayList?
【发布时间】:2020-02-26 21:41:44
【问题描述】:
"context A": {
    "name": "parent A",
    "operation": {
        "name": "op A",
        "convenienceType": {
            "descriptor": "View",
            "id": "view_id"
        }
    },
    "context B": {
        "name": "child B",
        "operation": {
            "name": "op B",
            "convenienceType": {
                "descriptor": "View",
                "id": "view_id"
            }
        }
    }   
}

我有一个 operation 对象,它在我的 JSON 中重复,但用于不同的上下文。操作的convenienceType 字段基本上来自枚举选择,因此无论operation 对象是从哪个上下文生成的,带有"View" 描述符的convenienceType 都是同一个对象。

我在我的 Groovy 脚本中使用 JSONSlurper 来解析它。这是我所看到的:

在上下文 A 级别:

operation.convenienceType.descriptor // evaluates to "View" (string)

在上下文 B 级别:

operation.convenienceType.descriptor // evaluates to ["View"] (array)

所以当我尝试做类似的事情时

operation.convenienceType.descriptor.toLowerCase

它适用于上下文 A,但在上下文 B 中出现错误,因为我的代码抱怨没有数组的 toLowerCase 方法。

任何人都知道为什么会发生这种情况...?

【问题讨论】:

  • 请添加代码以及显示该问题的确切 JSON。您提供的那个似乎嵌套得很奇怪,如果您尝试一下,您会发现它有效并且没有随机行为。很可能您的 json 中有 数组,并且您使用的代码将退回到隐式传播运算符调用。
  • 我必须相信你的钥匙链中的一个值是一个列表(使用 []),而不是一个对象(使用 {})。即使列表中只有一个对象,它也会将评估中的类型转换为列表。

标签: groovy jsonslurper


【解决方案1】:

你给出的例子并没有按照你指定的方式失败:

def j = '''{
"context A": {
    "name": "parent A",
    "operation": {
        "name": "op A",
        "convenienceType": {
            "descriptor": "View",
            "id": "view_id"
        }
    },
    "context B": {
        "name": "child B",
        "operation": {
            "name": "op B",
            "convenienceType": {
                "descriptor": "View",
                "id": "view_id"
            }
        }
    }   
}
}'''

import groovy.json.*

def p = new JsonSlurper().parseText(j)

assert p.'context A'.operation.convenienceType.descriptor == 'View'
assert p.'context A'.'context B'.operation.convenienceType.descriptor == 'View'

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多