Извлечение определенных данных из массива JSON в Groovy - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь извлечь конкретные данные из массива JSON с помощью groovy. Это пример массива:

{
"elements": [
    {
        "State": "AK",
        "DayOfWeek": "Mon",
        "StartTime": "0900",
        "EndTime": "2200"
    },
    {
        "State": "AK",
        "DayOfWeek": "Tue",
        "StartTime": "0900",
        "EndTime": "2200"
    },
    {
        "State": "AK",
        "DayOfWeek": "Wed",
        "StartTime": "0900",
        "EndTime": "2200"
    }]}

В этом случае я хочу извлечь StartTime из AK, когда DayOfWeek имеет значение Tue. Пока что единственный способ, которым я придумал это - использовать цикл for. Есть ли более эффективный способ извлечения данных без повторения этого?

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

В конечном счете, будет происходить некоторая итерация независимо от реализации. Groovy помогает нам написать это более выразительно. Здесь итерация выполняется с помощью find:

List elements = new groovy.json.JsonSlurper().parseText('''{
"elements": [
    {
        "State": "AK",
        "DayOfWeek": "Mon",
        "StartTime": "0900",
        "EndTime": "2200"
    },
    {
        "State": "AK",
        "DayOfWeek": "Tue",
        "StartTime": "0900",
        "EndTime": "2200"
    },
    {
        "State": "AK",
        "DayOfWeek": "Wed",
        "StartTime": "0900",
        "EndTime": "2200"
    }]}''')."elements"

return elements.find { it."State" == "AK" && it."DayOfWeek" == "Tue" }."StartTime"

Поскольку вы пометили это как «упрощенный», предположительно, когда вы попросили что-то более эффективное, вы действительно имели в виду, что хотите писать меньше кода, поэтомувсе вышеперечисленное подходит.

Если производительность поиска была проблемой, потому что вы хотите выполнить много поисков, вы можете использовать Map для индексации элементов (один раз), и тогда получение данных становится вопросом поиска, а непоиск:

Map elementsByStateAndDay = elements.groupBy { [it."State", it."DayOfWeek"] }
return elementsByStateAndDay.get(["AK", "Tue"]).head()."StartTime"
0 голосов
/ 07 октября 2019

Посмотрите на JsonSlurper

Примерно так:

def json = new JsonSurper().parseText(".....")
json.elements.each(element -> {
        // logic to extract what you want
    });
...