web-dev-qa-db-ja.com

JSONからGroovyへのパーサー

GroovyをJSONに変換することについて多くのことを見つけましたが、奇妙なことに、その逆ではありません。

そのあたりのGroovyパーサーへの(最良の)JSONは何ですか?

21
Gzorg

コンパイルされたGroovyクラスはJavaクラスと互換性があるため、JSONをPOJO(またはPOGO)に変換するために任意のJavaライブラリを使用できるはずです) 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 userData = mapper.readValue(json, User.class)

これにより、GroovyクラスのプロパティがJSONのキーにマップされます。

13
Dónal

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's not defined
assert jsonObj.gender == null
36
Fa11enAngel

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:クラス 'Java.lang.String'のオブジェクト '{integer:1、bool:true}'をクラス 'net.sf.jsonにキャストできません。 JSONObject '

メーリングリスト によると、これはGJsonlib.enhanceClasses()を呼び出さなかったために取得されますが、上記のように、私はそれを呼び出しました。

GroovyのJSON-libを嫌うのは価値のある努力だと私は結論付けました。

6
nes1983

HTTPBuilder でJSON-libを使用していますが、JSONSlurperクラスを使用して文字列をJSONインスタンスに解析しています。

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

オブジェクトからJSONに移動するには、次のようにします。

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

Json-libとGJson.enhanceClasses()で問題を抱えている人々へ。代わりにGJson.enhanceString()を試してください。

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