JsonSlurper противоречиво анализирует строки? Иногда возвращает String, иногда возвращает ArrayList? - PullRequest
0 голосов
/ 26 февраля
"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 операции в основном основано на enum-selection, поэтому для удобства тип с дескриптором "View" является одним и тем же объектом, независимо от контекста, из которого был создан объект operation.

I ' Я использую JSONSlurper в моем Groovy скрипте, чтобы разобрать это. Вот что я вижу:

На уровне контекста A:

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

На уровне контекста B:

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

Поэтому, когда я пытаюсь сделать что-то вроде

operation.convenienceType.descriptor.toLowerCase

Это работает для контекста A, но в контексте BI выдается ошибка, так как мой код жалуется, что toLowerCase метод не существует для массивов.

Кто-нибудь знает, почему это может произойти ...?

1 Ответ

0 голосов
/ 27 февраля

Пример, который вы приводите, не ошибается указанным вами способом:

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'
...