よく、お世話になっているObjectMapper、しかし、アゴで使うだけで、自分でこのパッケージをインストールすらしていなかったので、改めてサンプルを書いてみた。
まず、JDKにObjectMapperは入っていないので、pom.xmlで依存関係を設定する。
サンプルをMavenプロジェクトにすると、様々なjarファイルが.m2フォルダにダウンロードされる仕組みなので、外部へアクセスできない閉鎖的な開発環境では使えない。
しかし、職場に情報収集用のパソコンが用意されていれば、そこにEclipse(JDK付)を入れておけば、サンプルの動作を確認した後に、.m2フォルダからゴッソリとJarファイルをコピるだけで済むので、
様々なjarファイルの様々な依存関係を調査しながら様々なサイトから必死になってかき集める面倒さも無い。
<dependencies> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.3</version> </dependency> </dependencies>
そして、マッピングするサンプルのデータ・クラス。
package sample3; import java.text.SimpleDateFormat; public class SampleData1 { public int id; public String name; public java.sql.Timestamp timeStamp; final static public String TIMESTAMP_FORMAT = "#yyyy/MM/dd HH:m:s.S(z)#"; // JSONで表記するタイムスタンプ型の書式 public String toString() { SimpleDateFormat sdf = new SimpleDateFormat(TIMESTAMP_FORMAT); return "SampleData1 [id=" + id + ", name=\"" + name + "\", timeStamp=" + sdf.format(timeStamp) + "]"; } }
サンプルのデータ・クラスを使ったJSONとのデータ変換のサンプル。
package sample3; import java.io.IOException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; public class Sample3a { public static void main(String[] args) throws IOException { ObjectMapper om = new ObjectMapper(); om.setDateFormat(new SimpleDateFormat(SampleData1.TIMESTAMP_FORMAT)); // String title = "Object⇒JSON"; String json = ""; { SampleData1 sd1 = new SampleData1(); sd1.id = 100; sd1.name = "aaaaa"; sd1.timeStamp = new Timestamp(System.currentTimeMillis()); json = om.writeValueAsString(sd1); System.out.println("【" + title + "】\n " + json); } // /*String*/ title = "JSON⇒Object"; { SampleData1 sd1 = om.readValue(json, SampleData1.class); System.out.println("【" + title + "】\n " + sd1); } // /*String*/ title = "String⇒JSON"; { String str = new String(); str = "s t r i n g"; json = om.writeValueAsString(str); System.out.println("【" + title + "】\n " + json); } // /*String*/ title = "JSON⇒String"; { String str = om.readValue(json, String.class); System.out.println("【" + title + "】\n " + str); } // /*String*/ title = "Map<String,String>⇒JSON"; { Map<String, String> map = new HashMap<String, String>(); map.put("id", "ID00001"); json = om.writeValueAsString(map); System.out.println("【" + title + "】\n " + json); } // /*String*/ title = "JSON⇒Map<String,String>"; { Map<String, String> map = om.readValue(json, new TypeReference<Map<String, String>>() { }); System.out.println("【" + title + "】\n " + map); } } }
その実行結果がこちら。
【Object⇒JSON】 {"id":100,"name":"aaaaa","timeStamp":"#2018/01/12 22:59:11.808(JST)#"} 【JSON⇒Object】 SampleData1 [id=100, name="aaaaa", timeStamp=#2018/01/12 22:59:11.808(JST)#] 【String⇒JSON】 "s t r i n g" 【JSON⇒String】 s t r i n g 【Map<String,String>⇒JSON】 {"id":"ID00001"} 【JSON⇒Map<String,String>】 {id=ID00001}
ちょっと面倒なのがreadValueで
出力するデータ・クラスを指定するパラメータで・・・
データ・クラスがコレクション系クラスの場合、
new TypeReference<Map<String, String>>() { }
と妙な書き方をしなければいけないことだ。
勿論、
new TypeReference<List<Map<String, String>>>() { }
の様にネストしてもいいので、JSONっぽいラフなデータ構造にも対応している。
それから、タイムスタンプ型データの書式は、ObjectMapperのsetDateFormatを使って、SimpleDateFormat のインスタンスを与えることで好きな様に変えられるが、いくつかの書式が混在する場合は厄介かもしれない。