Groovyを使うようになってから、 XMLよりJSONで済ませてしまう機会が増えてきたのだが、いまいちよくわかっていない。 とりあえず現状で得たJSONに関する基本認識のメモ。
ここではすべて json-lib を使ってテストしています。
参考リンク
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文字列(として扱いたい文字列)を 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
JsonSlurper を使うと、リストからはじめても問題なく処理できる.
import groovy.json.*
def str = '["ProdA","ProdB","ProdC"]'
def o = new JsonSlurper().parseText(str)
println o
以上です。