2013-07-12 2 views
3

У меня есть объект JSON, который пропускается в функцию сохранения вКарты Струнной/строка для преобразования Карты в Groovy

{ 
    "markings": { 
     "headMarkings": "Brindle", 
     "leftForeMarkings": "", 
     "rightForeMarkings": "sock", 
     "leftHindMarkings": "sock", 
     "rightHindMarkings": "", 
     "otherMarkings": "" 
} 

** EDIT **

Система анализирует его и передает его моя функция как отображение. Я на самом деле не имеют JSON, хотя это не было бы трудно застроить JSON сам, это только кажется излишеством

* END EDIT **

toString() функция заканчивает положив результаты в базу данных как

"[rightForeMarkings:, otherMarkings:, leftForeMarkings:sock, leftHindMarkings:sock, rightHindMarkings:, headMarkings:brindle]" 

затем я хочу сохранить, что в виде строки (довольно легко), позвонив

params.markings.toString() 

Здесь я сохраняю информацию и возвращаю обновленную информацию.

Моя проблема заключается в том, что, поскольку я храню объект в БД в виде строки, я, похоже, не могу получить маркировку в качестве карты (чтобы затем преобразовать ее в JSON).

Я попробовал несколько разных вещей но безрезультатно, хотя вполне возможно, что я пошел о чем-то incorrectlywith этого ...

Eval.me(Item.markings) 
evaluate(Item.markings) 
Item.markings.toList() 

Заранее спасибо за помощь!

+2

Вы можете использовать 'JsonSlurper'. Этот [ответ] (http://stackoverflow.com/a/14268118/2051952) должен помочь. – dmahapatro

+0

JsonSlurper может работать. Это не идеальное решение для нашей реализации, но я думаю, что я отдам ему конец и дам вам знать, что происходит. –

+0

Похоже, вы не настаиваете на правильности строки. Я тестирую несколько вещей для вас, дам вам знать результаты. – dmahapatro

ответ

3

Бросать мои тесты.

Использование JSON конвертеров в Grails, я думаю, что это должно быть подход: (синоним @JamesKleeh и @GrailsGuy)

def json = '''{ 
        "markings": { 
         "headMarkings": "Brindle", 
         "leftForeMarkings": "", 
         "rightForeMarkings": "sock", 
         "leftHindMarkings": "sock", 
         "rightHindMarkings": "", 
         "otherMarkings": "" 
        } 
       }''' 

def jsonObj = grails.converters.JSON.parse(json) 
//This is your JSON object that should be passed in to the method 
print jsonObj //[markings:[rightForeMarkings:sock, otherMarkings:, leftForeMarkings:, leftHindMarkings:sock, rightHindMarkings:, headMarkings:Brindle]] 

def jsonStr = jsonObj.toString() 
//This is the string which should be persisted in db 
assert jsonStr == '{"markings":{"rightForeMarkings":"sock","otherMarkings":"","leftForeMarkings":"","leftHindMarkings":"sock","rightHindMarkings":"","headMarkings":"Brindle"}}' 

//Get back json obj from json str 
def getBackJsobObj = grails.converters.JSON.parse(jsonStr) 
assert getBackJsobObj.markings.leftHindMarkings == 'sock' 
+0

toString() не возвращает меня обратно строка, которую вы используете как jsonStr. Это то же самое, что и jsonObj. Кроме того, он передается моей функции в качестве параметров, которые отображаются. Система преобразует его по пути, прежде чем он ударит мою функцию. –

+0

Откуда вы получаете свой базовый объект json, который передается методу? У вас есть строка json или объект изначально, прежде чем применять какую-либо логику? @DavidZiemann – dmahapatro

+0

У меня есть объект. Мои извинения. Я должен был сделать это в моем первоначальном вопросе. Если я выхожу из разметки, это то же самое, что и ваш jsonObj. Похоже, я смог заставить вас работать (все еще немного тестировать). Я дам вам знать результаты :) –

4

Если я правильно понял, вы хотите преобразовать String в объект JSON? Вы можете фактически обходить преобразование его в карту, и разобрать его непосредственно в качестве объекта JSON:

import grails.converters.JSON 

def json = JSON.parse(Item.markings) 

Это даст вам весь объект JSON, а затем вы можете просто ссылаться на значения, как вы бы карту.

+0

Я вызываю 'render Item as JSON', когда возвращаю данные. Я предполагаю, что делает то же самое, что и 'JSON.parse (Item)', или я ошибаюсь? –

+0

@DavidZiemann Да, они очень похожи, но вы на самом деле не пытаетесь сделать JSON, верно? Просто получите ссылку на него? – Igor

+0

Если честно, я не уверен в различии.это часть API, и я переношу его в синтаксис withFormat {JSON {}}. Я довольно новичок в grails/groovy, если вы не могли сказать :) –

1

Edit # 2:

Таким образом, очевидно нет «безопасного» способа преобразовать эту строку обратно на карту без чего-то обычая. Я бы рекомендовал сохранить структуру в базе данных по мере ее поступления. Если вы можете это сделать, тогда вам понадобится только JSON.parse()

+0

. Выполнение этого не работает частично из-за характера того, как вещи передаются. Groovy берет JSON, который отправляется и создает объект params. Я здесь (я думаю), он удаляет «» на пустых строках. Когда я использую 'JSON.parse()', я получаю сообщение об ошибке, когда он попадает в первый ',' после пустого элемента (то есть: headMarkings) –

+0

См. Отредактированный отрезок сообщения –

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