Thu, February 18, 2010
JSONに関する基本認識,リストの処理
Groovyを使うようになってから、 XMLよりJSONで済ませてしまう機会が増えてきたのだが、いまいちよくわかっていない。 とりあえず現状で得たJSONに関する基本認識のメモ。(間違いもあるかもしれませんので注意)
ここではすべて json-lib を使ってテストしています。
参考リンク
JSONはいきなりリストからはじめられない
JSONというのは、以下のようにリストだけ、というのは許されていないようです。 かならずオブジェクト { } からはじめないといけない。 (XML的にいればルート要素がオブジェクトであるべき...という感じか。)
サンプルコード1(NG版) sample1.groovy
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
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文字列でリストを表現したい場合は...
サンプルコード3(OK版) sample3.groovy
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