Home About Contact
Groovy

JSONに関する基本認識,リストの処理

Groovyを使うようになってから、 XMLよりJSONで済ませてしまう機会が増えてきたのだが、いまいちよくわかっていない。 とりあえず現状で得たJSONに関する基本認識のメモ。

ここではすべて json-lib を使ってテストしています。

参考リンク

JSON はいきなりリストからはじめられない、ものらしい

JSONというのは、以下のようにリストだけ、というのは許されていないようです。 かならずオブジェクト { } からはじめないといけない。 (XML的に言えばルート要素がオブジェクトであるべき...という感じでしょうか。)

サンプルコード1(NG版) sample1.groovy

@Grab(group='net.sf.json-lib', module='json-lib', version='2.4', classifier='jdk15')
import net.sf.json.JSONObject

def str = '["ProdA","ProdB","ProdC"]'
def o = JSONObject.fromObject( str )

実行結果

$ groovy sample1
Caught: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of ["ProdA","ProdB","ProdC"]
	at sample1.run(sample1.groovy:6)

サンプルコード2(OK版) sample2.groovy

@Grab(group='net.sf.json-lib', module='json-lib', version='2.4', classifier='jdk15')
import net.sf.json.groovy.*
import net.sf.json.JSONObject

def str = '["ProdA","ProdB","ProdC"]'
def o = new JsonSlurper().parseText( str )

println '--- test1 ---'
println o.getClass().name
println o.toString()

println '--- test2 ---'
o.each{ println it }

json-lib の場合は、JSONObject.fromObject() を使ってJSON文字列をObject化する代わりに、 new JsonSlurper().parseText() を使うことで、 リストだけのJSON文字列でもエラーを回避できます... というサンプル。

実行結果

$ groovy sample2
--- test1 ---
net.sf.json.JSONArray
["ProdA","ProdB","ProdC"]
--- test2 ---
ProdA
ProdB
ProdC

※JSONArray に変換されています。

リストを扱いたい場合で普通にJSON文字列として表現する場合

先ほどのサンプルでは、リストだけのJSON文字列(として扱いたい文字列)を JsonSlurper を使うことでエラー回避しましたが、普通に JSON文字列でリストを表現したい場合。

import net.sf.json.JSONObject

def str = '{"productName":["ProdA","ProdB","ProdC"]}'
def o = JSONObject.fromObject( str )

println '--- test1 ---'
println o.getClass().name
println o.toString()

println '--- test2 ---'
o.each{ println it }

println '--- test3 ---'
o.productName.each{ println it }

実行結果

$ groovy sample3
--- test1 ---
net.sf.json.JSONObject
{"productName":["ProdA","ProdB","ProdC"]}
--- test2 ---
productName=["ProdA","ProdB","ProdC"]
--- test3 ---
ProdA
ProdB
ProdC

追記 groovy.json.JsonSlurper を使えば問題ない

JsonSlurper を使うと、リストからはじめても問題なく処理できる.

import groovy.json.*

def str = '["ProdA","ProdB","ProdC"]'
def o = new JsonSlurper().parseText(str)
println o

以上です。