2014-11-27 2 views
0

Я пытаюсь разобрать данные JSON и назначить его POJO в Grails.Groovy - с закрытием с несколькими ссылками

Я начал с

obj.param=jsonRequest.jsonWrap.attrib.something.jsonParam 

После некоторого экспериментирования и рефакторинга, это выглядит, как это сейчас.

jsonRequest.jsonWrap.attrib.something.with { 
    obj.param1=jsonParam1 
    obj.param2=jsonParam2 
    //... 
    } 
    } 

Теперь, могу ли я избежать повторного использования ссылки obj?

+0

две строки с 'param1 = ... '- это ошибки копирования и вставки? – cfrick

+0

Почему 'jsonRequest.with {jsonWrap.attrib.something.with {' вместо просто 'jsonRequest.jsonWrap.attrib.something.with {'? – BalRog

+0

@cfrick две строки были опечаткой. @BalRog 'jsonRequest.jsonWrap.attrib.something.with {' тоже отлично. Отредактировал код. – Halley

ответ

2

Я представляю, что ваша фактическая отправная точка - это что-то вроде следующего. На стороне JSON:

import groovy.json.JsonSlurper 

String jsonText = '''{ 
    "jsonWrap":{ 
    "attrib":{ 
     "something":{ 
     "jsonParam1": "value1", 
     "jsonParam2": "value2", 
     "jsonParam3": "value3", 
     "jsonParam4": "value4", 
     "jsonParam5": "value5" 
     } 
    } 
    } 
}''' 

def jsonRequest = new JsonSlurper().parseText(jsonText) 

На Groovy стороны:

class ObjectType { 
    def param1, param2, param3, param4, param5 
} 

def obj = new ObjectType() 

Теперь, если бы я имел никакого контроля над тем, как определяются либо на стороне JSON или Groovy стороны, то я бы сделал мой darnedest к убедитесь, что имена свойств объекта «что-то» JSON точно такие же, как имена свойств класса Groovy «ObjectType». Например, как это:

class ObjectType { 
    def jsonParam1, jsonParam2, jsonParam3, jsonParam4, jsonParam5 
} 

Затем демаршаллизации на «что-то» объект в Groovy так просто, как это:

def obj = new ObjectType(jsonRequest.jsonWrap.attrib.something) 

только одна ссылка на объект JSON. Только одна ссылка на объект Groovy. И первый используется для создания экземпляра последнего. Кроме того, обратите внимание, что нет необходимости вообще ссылаться на свойства. То есть объекты JSON из slurper являются экземплярами Map, поэтому, если имена свойств совпадают, вы можете использовать синтаксис «Конструктор конструктора по умолчанию».


Если, однако, вы не контролируете свойство именования в любом множестве объектов, я бы рекомендовал другую карту на основе укороченный. Сначала определим постоянную карту из одного набора имен свойств к другому, например, так:

def map = [param1:"jsonParam1", param2:"jsonParam2", param3:"jsonParam3", 
      param4:"jsonParam4", param5:"jsonParam5"] 

Тогда я хотел бы использовать что-то вроде этого для объекта немаршалинг:

def obj = new ObjectType().with { o -> 
    jsonRequest.jsonWrap.attrib.something.with { j -> 
     map.each { oParam, jParam -> o[oParam] = j[jParam] } 
    } 
    o 
} 
2

Я не думаю, что есть тривиальный способ обмануть groovy в "use objectA, если получение необходимо и objectB для установки". Если obj выше - карта, или вы можете применить карту к этому объекту, то вы можете создать карту в своем блоке with и использовать это. Если вам нужно иметь вложенные структуры, вам потребуется больше работы.

def jsonParam = new Expando([ p1: 'p1', p2: 'p2', p3: 'p3', ]) 

def obj = new Expando(
    jsonParam.with{ 
     [ 
     param1: p1, 
     param3: p3, 
     ] // `with` will return this map 
    }) 

assert obj.param1==jsonParam.p1 
assert obj.param3==jsonParam.p3 

Я использую expandos для простого кода.

Смежные вопросы