RM-BLOG

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【java】JSONメモ

JSONライブラリの簡単な使い方メモ



 


いろいろあるらしいが俺はこれ↓しか知らないのでこれで。
http://jsonic.osdn.jp/

ここからjsonicのライブラリ(jarファイル)をDLしてきて使う。
テスト用にオブジェクトを1つとそれをJSON形式に変換するための簡単なjavaクラスを作る。

■テスト用オブジェクト(JsonTestClassPOJO.java

import java.util.*;
import java.text.*;
import java.io.*;

public class JsonTestClassPOJO {

	private String name;
	private int number;
	private List<String> list;
	
	public JsonTestClassPOJO() {
		this("",0,new ArrayList());
	}
	
	public JsonTestClassPOJO(String name_arg,int number_arg,List<String> list_arg) {
		this.name = name_arg;
		this.number = number_arg;
		this.list = list_arg;
	}
	
	public void setName(String name_arg) {
		this.name = name_arg;
	}
	
	public void setNumber(int number_arg) {
		this.number = number_arg;
	}
	
	public void setList(List<String> list_arg) {
		this.list = list_arg;
	}
	
	public void addList(String value) {
		this.list.add(value);
	}
	
	public String getName() {
		return this.name;
	}
	
	public int getNumber() {
		return this.number;
	}
	
	public List<String> getList() {
		return this.list;
	}
	


}



■「テスト用オブジェクト」をJSON形式に変換する簡単なjavaクラス(JsonTest.java

import net.arnx.jsonic.*;
import net.arnx.jsonic.io.*;
import net.arnx.jsonic.parse.*;
import net.arnx.jsonic.util.*;
import net.arnx.jsonic.web.*;

import java.util.*;
import java.text.*;
import java.io.*;

public class JsonTest {
	
	
	public static void main(String[] args) {
		
		try {
			execMain();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		
	}
	
	
	private static void execMain() throws Throwable {
		
		JsonTestClassPOJO pojo = new JsonTestClassPOJO();
		pojo.setName("TEST_POJO");
		pojo.setNumber(100);
		pojo.addList(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(new Date()));
		pojo.addList("1個前に日付いれました");
		pojo.addList(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS").format(new Date()));
		pojo.addList("もう1回日付いれました");
		pojo.addList(pojo.getName() + "_" + String.valueOf(pojo.getNumber()));
		pojo.addList("名前+'_'+数値をいれました");
		
		System.out.println("** Original Object");
		printObject(pojo);
		System.out.println();
		
		String jsonText = JSON.encode(pojo);
		System.out.println("** JSON ENCODE");
		System.out.println(jsonText);
		System.out.println();
		
		JsonTestClassPOJO pojoDecode = JSON.decode(jsonText, JsonTestClassPOJO.class);
		System.out.println("** JSON DECODE");
		printObject(pojoDecode);
		//System.out.println("Name:" + pojoDecode.getName());
		//System.out.println("Number:" + String.valueOf(pojoDecode.getNumber()));
		//List<String> listFromPojoDecode = pojoDecode.getList();
		//for (int i=0; i < listFromPojoDecode.size(); i++) {
		//	System.out.println("List[" + String.valueOf(i) + "]:" + listFromPojoDecode.get(i));
		//}
		//System.out.println();
		
		System.out.println("** Object Compare");
		System.out.println("Original.equals(JsonDecodeObject):" + String.valueOf(pojo.equals(pojoDecode)));
		System.out.println();
		
	}
	
	private static void printObject(JsonTestClassPOJO pojo) {
		System.out.println("Name:" + pojo.getName());
		System.out.println("Number:" + String.valueOf(pojo.getNumber()));
		List<String> listFromPojoDecode = pojo.getList();
		for (int i=0; i < listFromPojoDecode.size(); i++) {
			System.out.println("List[" + String.valueOf(i) + "]:" + listFromPojoDecode.get(i));
		}
		System.out.println();
	}
	
}



■実行結果(※JSON形式変換後の文字列だけを抜粋)

** JSON ENCODE
{"list":["2015/09/25 00:33:28.075","1個前に日付いれました","2015/09/25 00:33:28.091","もう1回日付いれました","TEST_POJO_100","名前+'_'+数値をいれました"],"name":"TEST_POJO","number":100}





上記URLからDLしてくると下記3つのjarファイルが手に入る
jsonic-1.3.8.jar
jsonic-1.3.8-javadoc.jar
jsonic-1.3.8-sources.jar
が、クラスパスにはとりあえず「jsonic-1.3.8.jar」だけを通しておけば事足りるようだ。

net.arnx.jsonic.JSON.encodeの引数にクラスを引き渡すと
JSON形式の文字列になって帰ってくる(結果はString型)。
JSON形式変換に関してはこれをそのまま使うって感じ。

逆に復元する場合はnet.arnx.jsonic.JSON.decodeの
・第一引数に「JSON形式文字列」
・第二引数に復元したいクラスの.classフィールド
を渡せば復元できる。
ただし復元前のオブジェクトと復元後のオブジェクトは中身は同じでも別オブジェクトになる(equalsメソッドがfalseを返す)。
簡単にいえば
①オブジェクトA⇒JSON形式変換⇒文字列B
②文字列B⇒JSON形式逆変換(復元)⇒オブジェクトA'
という経路をたどった時、AとA'は中身のフィールドの値は同じでも別オブジェクトになっている。
(まあ完全同じにしたい意図は全くないのだが)

こういうすごく単純なクラスならこれで済むのだが
もうちょい複雑なクラスだとどーゆー動きするんだろう。
気になるけど面倒だからやらない。