Подтвердить что ты не робот

JSON для парсера Groovy

Я нашел много вещей о преобразовании Groovy в JSON, но, как ни странно, не в другую сторону.

Каков синтаксический анализатор (лучший) JSON для Groovy?

4b9b3361

Ответ 1

Поскольку скомпилированные классы Groovy совместимы с классами Java, вы должны иметь возможность использовать любую библиотеку Java для преобразования JSON в POJO (или POGO). Jackson - довольно популярный выбор, который вы можете использовать для преобразования JSON следующим образом:

String json = '{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}'

на карту, используя:

Map<String,Object> userData = mapper.readValue(json, Map.class)

Или если вы хотите преобразовать JSON в класс Groovy User:

User userData = mapper.readValue(json, User.class)

Это отобразит свойства класса Groovy в ключи в JSON.

Ответ 2

Если вы находитесь в Groovy 1,8 или новее, в JsonSlurper вы можете построить такой способ:

import groovy.json.JsonSlurper

//Attention: you have to use double quotes inside the json string
def jsonObj = new JsonSlurper().parseText( '{ "name":"Peter", "age": 23}' )

assert jsonObj.name == "Peter"
assert jsonObj.age == 23
//this won't work, because it not defined
assert jsonObj.gender == null

Ответ 3

JSON-lib утверждает, что сможет преобразовать POGO в JSON и обратно. Если POGO означает то, что я думаю (Plain Old Groovy Object), вы устанавливаете:).

Они приводят этот пример:

def strAsJsonObject = "{integer:1, bool: true}" as JSONObject

Обновление

Я пробовал сам lib, это полный код:

import net.sf.*;
import net.sf.json.*;
import net.sf.json.groovy.*;

println "hi"
GJson.enhanceClasses()
def strAsJsonObject = "{integer:1, bool: true}" as JSONObject
println strAsJsonObject

Он преследует вас через марафон загрузки зависимостей (ezmorph, commons lang, commons logger), и как только вы их разрешите, вы получите следующее:

Исключение в потоке "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Нельзя использовать объект '{integer: 1, bool: true} 'с классом' java.lang.String ' к классу 'net.sf.json.JSONObject'

В соответствии с Список рассылки, вы получите это для того, чтобы не вызывать GJsonlib.enhanceClasses(), но я это назвал, как вы можете видеть выше.

Я пришел к выводу, что стоит уповать на ненависть Groovy JSON-lib.

Ответ 4

Я использую JSON-lib в HTTPBuilder, но я использую класс JSONSlurper для синтаксического анализа строки в экземпляре JSON:

JSON jsonMapObject = new JsonSlurper().parse( "{integer:1, bool: true}" );

Чтобы перейти от Object to JSON, я делаю это:

//from a map:
new JSONObject().putAll( [one:'1', two:'two']).toString()
//from an object:
JSONObject.fromObject( somePOGO ).toString()

Ответ 5

Для людей, у которых возникают проблемы с json-lib и GJson.enhanceClasses(). Вместо этого попробуйте GJson.enhanceString().

GJson.enhanceString()
def o = "{\"x\": 20.0}" as JSONObject