SQLの窓

2017年05月25日


Java で JSON 文字列を オブジェクトに変換する Google Gson の基本 4 パターン

ほぼ Google Gson のユーザガイドに記述されている内容です。
一般 JSON オブジェクトフォーマット

JSON 文字列のルートがいきなり、 JSON オブジェクトの一般プロパティになっている場合です。
{
    "link": "http://www.yahoo.co.jp/",
    "name": "Yahoo! JAPAN"
}
一番使う事の多いパターンの基本で、そのフォーマットのクラス定義を作成して、Gson に展開してもらいます。 一般 配列フォーマット JSON 文字列のルートがいきなり、 JSON オブジェクトの配列になっている場合で、データとしては特殊な部類になります。
[
    "http://www.yahoo.co.jp/",
    "Yahoo! JAPAN"
]
ですが、Gson 側では以下のように比較的簡単に扱えます String[] data = gson.fromJson(json, String[].class); また、これは Java での作業の都合で、ArrayList に変更する事も可能です。(但し、少し面倒です) Type arrayListType = new TypeToken<ArrayList<String>>(){}.getType(); ArrayList<String> al = gson.fromJson(json, arrayListType); 配列の中のデータ毎に型が違うフォーマット
[
    "サイトデータ",
    1,
    {
        "link": "http://www.yahoo.co.jp/",
        "name": "Yahoo! JAPAN"
    }
]
このタイプが一番面倒です。通常使われる事は無いと思いますが、使用する場合は一つ一つ対応する事になると思います。( Gson でのオリジルサンプルコードはここにあります ) オブジェクト内にオブジェクト配列
{
    "title": "サイトデータ",
    "number": 2,
    "urlList": [
        {
            "link": "http://www.yahoo.co.jp/",
            "name": "Yahoo! JAPAN"
        },
        {
            "link": "https://www.google.co.jp/",
            "name": "Google"
        }
    ]
}
データフォーマットとしてはこれが一番優れており、全てクラスを定義する事によって容易に対応できます。
import java.lang.reflect.Type;
import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;


public class Main {

	// メンバ用クラス
	class LinkFormat {
		String link;
		String name;
	}
	
	// メンバに配列
	class SiteData {
		String title;
		int number;
		
		LinkFormat[] urlList;
	}
	
	// メンバに ArrayList
	class SiteDataList {
		String title;
		int number;
		
		ArrayList <LinkFormat> urlList;
	}
		
	public static void main(String[] args) {
	
		String json = null;
		
		// 一般 JSON オブジェクトフォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "{";
		json += 	"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 	"\"name\":\"Yahoo! JAPAN\"";
		json += "}";
		System.out.println(json);

		Gson gson = new Gson();

		// オブジェクトに変換
		System.out.println("-----------------------------------------");
		
		LinkFormat linkFormat = gson.fromJson(json, LinkFormat.class);

		System.out.println(linkFormat.link);
		System.out.println(linkFormat.name);

		// 一般 配列フォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "[";
		json += 	"\"http://www.yahoo.co.jp/\",";
		json += 	"\"Yahoo! JAPAN\"";
		json += "]";
		System.out.println(json);

		// 配列に変換
		String[]  data = gson.fromJson(json, String[].class);

		System.out.println(data[0]);
		System.out.println(data[1]);

		// ArrayListに変換
		System.out.println("-----------------------------------------");
		
		Type arrayListType = new TypeToken<ArrayList<String>>(){}.getType();
		ArrayList<String>  al = gson.fromJson(json, arrayListType);

		System.out.println(al.get(0));
		System.out.println(al.get(1));

		// 特殊 JSON オブジェクト配列フォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "[";
		json += 	"\"サイトデータ\",";
		json += 	"1,";
		json += 	"{";
		json += 		"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 		"\"name\":\"Yahoo! JAPAN\"";
		json += 	"}";
		json += "]";
		System.out.println(json);

		// JSON 文字列配列内の型が違う場合はひとつひとつ対応
		JsonParser parser = new JsonParser();
		JsonArray array = parser.parse(json).getAsJsonArray();
		String title = gson.fromJson(array.get(0), String.class);
		int number = gson.fromJson(array.get(1), int.class);
		LinkFormat lf = gson.fromJson(array.get(2), LinkFormat.class);

		System.out.println( title );
		System.out.println( number );
		System.out.println( lf.link );
		System.out.println( lf.name );

		// JSON オブジェクト内にオブジェクト配列
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "{";
		json += "\"title\" : \"サイトデータ\",";
		json += "\"number\" : 2,";
		json += "\"urlList\" : [";
		json += 	"{";
		json += 		"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 		"\"name\":\"Yahoo! JAPAN\"";
		json += 	"},";
		json += 	"{";
		json += 		"\"link\":\"https://www.google.co.jp/\",";
		json += 		"\"name\":\"Google\"";
		json += 	"}";
		json += "]";
		json += "}";
		System.out.println(json);
		
		// 配列バージョン
		SiteData sd = gson.fromJson(json, SiteData.class);
		System.out.println( sd.title );
		System.out.println( sd.number );
		System.out.println( sd.urlList[0].link );
		System.out.println( sd.urlList[0].name );
		System.out.println( sd.urlList[1].link );
		System.out.println( sd.urlList[1].name );

		// ArrayList バージョン
		SiteDataList sdl = gson.fromJson(json, SiteDataList.class);
		System.out.println( sdl.title );
		System.out.println( sdl.number );
		System.out.println( sdl.urlList.get(0).link );
		System.out.println( sdl.urlList.get(0).name );
		System.out.println( sdl.urlList.get(1).link );
		System.out.println( sdl.urlList.get(1).name );

	}

}


※ 整形したい場合は以下のようにします
// オブジェクトを整形して JSON 文字列に変換する
Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gsonPretty.toJson(sd);


タグ:java JSON
【Javaの最新記事】
posted by lightbox at 2017-05-25 21:41 | Java | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり