Index > JSONに関する基本認識,リストの処理
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
 Twitter
follow me on Twitter
 Categories