Symfoware

Symfowareについての考察blog

Java JSONICでjsonな文字列をオブジェクトに直接デコード

Javaでjsonを扱うライブラリ「JSONIC」
http://jsonic.osdn.jp/

デコード方法のメモです。


解析したい文字列



今回解析したいのは、こんなjson。


  1. {
  2. "version":"0.8.2",
  3. "config": {
  4.     "title":"Hello World",
  5.     "option":{},
  6.     "page": {
  7.         "paper-type":"A4",
  8.         "orientation":"portrait",
  9.         "margin-top":"20",
  10.         "margin-bottom":"21",
  11.         "margin-left":"22",
  12.         "margin-right":"23"
  13.         }
  14.     }
  15. }



test.jsonというファイル名で保存しています。
最終的には、オブジェクトにマッピングしたい。



ベタな方法



最初に試してみたベタな方法。
Mapオブジェクトとして取り出し、地道に値を取得しています。


  1. import java.io.FileReader;
  2. import java.util.Map;
  3. import net.arnx.jsonic.JSON;
  4. public class MainProcess {
  5.     
  6.     public static void main(String... args) throws Exception {
  7.         
  8.         @SuppressWarnings("rawtypes")
  9.         Map root = (Map)JSON.decode(new FileReader("test.json"));
  10.         
  11.         // versionの値を表示
  12.         System.out.println(root.get("version"));
  13.         
  14.         // configの内容を辞書型で取得
  15.         @SuppressWarnings("rawtypes")
  16.         Map config = (Map)root.get("config");
  17.         
  18.         // config - titleを表示
  19.         System.out.println(config.get("title"));
  20.         
  21.         
  22.         // pageの内容を辞書型で取得
  23.         @SuppressWarnings("rawtypes")
  24.         Map page = (Map)config.get("page");
  25.         
  26.         // 内容を表示
  27.         System.out.println(page.get("paper-type"));
  28.         System.out.println(page.get("orientation"));
  29.         System.out.println(page.get("margin-top"));
  30.         System.out.println(page.get("margin-bottom"));
  31.         System.out.println(page.get("margin-left"));
  32.         System.out.println(page.get("margin-right"));
  33.         
  34.     }
  35. }




実行結果。


0.8.2
Hello World
A4
portrait
20
21
22
23







お試しオブジェクト



サンプルを見てみると、


  1. // 変換対象のPOJOを準備
  2. Hoge hoge = new Hoge();
  3. hoge.number = 10;     // public field
  4. hoge.setString("aaa"); // public property
  5. hoge.setArray(new int[] {1, 2, 3});




publicなフィールド名、またはsetXXXを用意しておけばマッピングしてくれる模様。
先ほどのjsonの項目と対応するクラスを作成します。

とりあえず、versionだけ。


  1. public class JSONMapper {
  2.     
  3.     private String version;
  4.     
  5.     public void setVersion(String version) {
  6.         this.version = version;
  7.     }
  8.     
  9.     public String getVersion() {
  10.         return version;
  11.     }
  12.     
  13. }




デコード用のプログラムはこうなりました。


  1. import java.io.FileReader;
  2. import net.arnx.jsonic.JSON;
  3. public class MainProcess {
  4.     
  5.     public static void main(String... args) throws Exception {
  6.         
  7.         
  8.         JSONMapper root = JSON.decode(new FileReader("test.json"), JSONMapper.class);
  9.         
  10.         System.out.println(root.getVersion());
  11.     }
  12. }





狙い通りの実行結果です。


0.8.2







ネストとキャメルケース



ネストしている部分は、setXXX(ネスト内のクラス)を指定。
変数名に「-」(ハイフン)が含まれる場合は、ハイフンを除いてキャメルケースに。
例えば「paper-type」なら「setPaperType」にすればOKです。

クラスの構成はこうなりました。

・JSONMapper


  1. public class JSONMapper {
  2.     
  3.     private String version;
  4.     private Config config;
  5.     
  6.     public void setVersion(String version) {
  7.         this.version = version;
  8.     }
  9.     
  10.     public String getVersion() {
  11.         return version;
  12.     }
  13.     
  14.     // config(ネスト部分)
  15.     public void setConfig(Config config) {
  16.         this.config = config;
  17.     }
  18.     
  19.     public Config getConfig() {
  20.         return config;
  21.     }
  22.     
  23. }





・Config


  1. public class Config {
  2.     
  3.     private String title;
  4.     private Page page;
  5.     
  6.     public void setTitle(String title) {
  7.         this.title = title;
  8.     }
  9.     
  10.     public String getTitle() {
  11.         return title;
  12.     }
  13.     
  14.     
  15.     // page(ネスト部分)
  16.     public void setPage(Page page) {
  17.         
  18.         this.page = page;
  19.     }
  20.     
  21.     public Page getPage() {
  22.         return page;
  23.     }
  24.     
  25. }





・Page


  1. public class Page {
  2.     
  3.     private String paperType;
  4.     private String orientation;
  5.     private float marginTop;
  6.     private float marginBottom;
  7.     private float marginLeft;
  8.     private float marginRight;
  9.     
  10.     // paper-typeの用にハイフンが入っている場合は、キャメルケース
  11.     public void setPaperType(String paperType) {
  12.         this.paperType = paperType;
  13.     }
  14.     
  15.     public String getPaperType() {
  16.         return paperType;
  17.     }
  18.     
  19.     public void setOrientation(String orientation) {
  20.         this.orientation = orientation;
  21.     }
  22.     
  23.     public String getOrientation() {
  24.         return orientation;
  25.     }
  26.     
  27.     public void setMarginTop(float marginTop) {
  28.         this.marginTop = marginTop;
  29.     }
  30.     
  31.     public float getMarginTop() {
  32.         return marginTop;
  33.     }
  34.     
  35.     public void setMarginBottom(float marginBottom) {
  36.         this.marginBottom = marginBottom;
  37.     }
  38.     
  39.     public float getMarginBottom() {
  40.         return marginBottom;
  41.     }
  42.     
  43.     public void setMarginLeft(float marginLeft) {
  44.         this.marginLeft = marginLeft;
  45.     }
  46.     
  47.     public float getMarginLeft() {
  48.         return marginLeft;
  49.     }
  50.     
  51.     public void setMarginRight(float marginRight) {
  52.         this.marginRight = marginRight;
  53.     }
  54.     
  55.     public float getMarginRight() {
  56.         return marginRight;
  57.     }
  58. }





最初に記載したのと同等の解析コードはこうなります。


  1. import java.io.FileReader;
  2. import net.arnx.jsonic.JSON;
  3. public class MainProcess {
  4.     
  5.     public static void main(String... args) throws Exception {
  6.         
  7.         
  8.         JSONMapper root = JSON.decode(new FileReader("test.json"), JSONMapper.class);
  9.         
  10.         System.out.println(root.getVersion());
  11.         
  12.         System.out.println(root.getConfig().getTitle());
  13.         
  14.         System.out.println(root.getConfig().getPage().getPaperType());
  15.         System.out.println(root.getConfig().getPage().getOrientation());
  16.         System.out.println(root.getConfig().getPage().getMarginTop());
  17.         System.out.println(root.getConfig().getPage().getMarginBottom());
  18.         System.out.println(root.getConfig().getPage().getMarginLeft());
  19.         System.out.println(root.getConfig().getPage().getMarginRight());
  20.     }
  21. }




実行結果。


0.8.2
Hello World
A4
portrait
20.0
21.0
22.0
23.0




これは便利。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/08/05(水) 22:38:37|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Java JAXBでXMLな文字列をオブジェクトにマッピングする | ホーム | PHP 5.6 + CodeIgniter 3 + ThinreportsでPDF帳票を出力する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1781-758c5b0a
この記事にトラックバックする(FC2ブログユーザー)