Groovy/Grails: объявление JsonBuilder внутри цикла без перезаписи ранее созданных json-файлов

Здравствуйте, я пытаюсь создать список объектов json в groovy.

List relClinicStatementList = []
            for (BloodTestRow row in BTList){
                def jsonListBuilder = new groovy.json.JsonBuilder()
                def internalJson = jsonListBuilder{
                        'targetRelationshipToSource' {
                            'code' 'part-of'
                            'codeSystem' 'MG'
                        }
                        'observationResult'{
                            'observationFocus'{
                                'code' "${row.exam}"
                                'codeSystem' 'mobiguide'
                                'displayName' "${row.exam}"
                            }
                            'observationValue' {
                                'physicalQuantity' {
                                    'value' "${row.value}"
                                    'unit' "${row.unit}"
                                    }
                            }
                        }
                    }
                println jsonListBuilder.toPrettyString()
                relClinicStatementList.add(internalJson)

            }

И метод toPrettyString() правильно показывает структуру json, которую я хочу. Однако, если в конце цикла я попытаюсь распечатать все элементы, которые у меня есть в списке, следующим образом:

                    for (JsonBuilder entry in relClinicStatementList){
                    println entry.toPrettyString()
                    }

Я получаю, чтобы все элементы в моем списке relClinicalStatement были равны последним, которые я создал... Я чувствовал, что объявление нового JsonBuilder в каждом цикле предотвратит такое поведение... я что-то упустил? Должен признаться, что я пришел из Java, и у меня такое ощущение, что использование классных классов заставляет это вести себя немного иначе, чем я ожидаю. Как решить эту проблему?

заранее спасибо


person neneItaly    schedule 25.02.2014    source источник
comment
разве вы не должны добавить jsonListBuilder в relClinicStatementList вместо internalJson?   -  person cfrick    schedule 25.02.2014
comment
@cfrick, я пробовал оба решения (добавляя internalJson или добавляя jsonListBuilder), но это не решило проблему. Тем не менее в списке есть все объекты, равные последнему json, который я создаю.   -  person neneItaly    schedule 26.02.2014


Ответы (1)


Я не могу воспроизвести поведение, которое вы видите, но я думаю, что проблема в том, что я не верю, что internalJson - это то, что вы думаете (это список из двух замыканий).

Если вы измените свой код на:

List relClinicStatementList = btList.collect { row ->
    new groovy.json.JsonBuilder( {
        targetRelationshipToSource {
            code       'part-of'
            codeSystem 'MG'
        }
        observationResult {
            observationFocus {
                code        "$row.exam"
                codeSystem  'mobiguide'
                displayName "$row.exam"
            }
            observationValue {
                physicalQuantity {
                    value "$row.value"
                    unit  "$row.unit"
                }
            }
        }
    } )
}

relClinicStatementList.each { entry ->
    println entry.toPrettyString()
}

Это работает так, как вы ожидаете?

person tim_yates    schedule 25.02.2014
comment
Спасибо Тим. То, что вы подчеркнули, было как раз точным. Мой способ создания списка действительно создал список замыканий (а это не то, что я хотел). Мне все еще нужно узнать подробности о Grails и некоторых его объектах и ​​структурах (в Java нет такого понятия, как замыкание :)), но это определенно помогло! Спасибо - person neneItaly; 26.02.2014