- [Vue.js]時計?タイムコードを表示するWebアプリ
- (2021/11/16)
- ポエム
- (2020/09/30)
- メトロノームアプリをリリース
- (2017/04/22)
- Sikulix勉強中:便利関数
- (2017/02/25)
- [JavaFX]学習メモ
- (2016/09/22)
Androidでデータを手軽に永続化しておくために、JSONICが利用できます。
JSON形式でデータを保存するためにあれこれ難しいことをする必要はありません。
JSONICを使うと、データ保持用のクラスをなんら設定なしにJSON形式の文字列に変換できます。
JSONIC - simple json encoder/decoder for java
http://jsonic.sourceforge.jp/
JSON形式への変換のサンプルを作りました。(JSON形式から戻すのはまだ作っていない)
データクラスとして、再帰構造を持ったクラスを定義しました。
package jp.fsoriented.json.sample; import java.util.Iterator; import java.util.LinkedList; import android.util.Log; /** * 出力データクラス。名前、ID、サブ項目を持つ。 * * @author LapisCactus * */ public class Item { private int mId; private String mName; private LinkedList- mSubItems; private static int counter = 0; /** * コンストラクタ * @param name 名前 */ public Item(String name){ mId = counter++; mName = name; mSubItems = new LinkedList
- (); } /** * 指定されたアイテムを追加する。 * @param item 追加するアイテム * @return このアイテム */ public Item add(Item item){ mSubItems.add(item); return this; } // JSONエンコードで使用される public String getName(){ return mName; } // JSONエンコードで使用される public int getId(){ return mId; } // JSONエンコードで使用される public Item[] getSubItems(){ return mSubItems.toArray(new Item[0]); } /** * デバッグ表示 */ public void print(){ Log.d("Item", String.format("Item[%d:%s](%d)", mId, mName, mSubItems.size())); Iterator
- iterator = mSubItems.iterator(); while(iterator.hasNext()){ iterator.next().print(); } } }
#publicなgetterか、publicなフィールドをもとに変換を行うようです。
#サンプルでは3つのgetterがあり、変換対象となっています。
このItemクラスを使って動作を確認します。二分木にItemを構成して、ログに内容を出力しています。
package jp.fsoriented.json.sample; import net.arnx.jsonic.JSON; import android.app.Activity; import android.os.Bundle; import android.util.Log; /** * JSONICの利用サンプル * * @author LapisCactus * */ public class JSONTestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 高さ4の二分木を作成 Item root = new Item("item"); createTree(root, 4); root.print(); // オブジェクトをJSON文字列に変換 String json = JSON.encode(root); Log.d("JSON", json); } /** * 再帰的にItemを作成する。二分木。 * @param item ルートとなるItem * @param depth 二分木の高さ */ private void createTree(Item item, int depth){ if(depth <= 1){ return; } Item left = new Item(item.getName()+"L"); Item right = new Item(item.getName()+"R"); item.add(left).add(right); createTree(left, depth-1); createTree(right, depth-1); } }
動作結果:うまく変換されています。
01-29 14:57:30.784: D/Item(390): Item[5:itemLLL](0)
01-29 14:57:30.794: D/Item(390): Item[6:itemLLR](0)
01-29 14:57:30.794: D/Item(390): Item[3:itemLL](2)
01-29 14:57:30.794: D/Item(390): Item[7:itemLRL](0)
01-29 14:57:30.794: D/Item(390): Item[8:itemLRR](0)
01-29 14:57:30.794: D/Item(390): Item[4:itemLR](2)
01-29 14:57:30.794: D/Item(390): Item[1:itemL](2)
01-29 14:57:30.794: D/Item(390): Item[11:itemRLL](0)
01-29 14:57:30.794: D/Item(390): Item[12:itemRLR](0)
01-29 14:57:30.814: D/Item(390): Item[9:itemRL](2)
01-29 14:57:30.814: D/Item(390): Item[13:itemRRL](0)
01-29 14:57:30.814: D/Item(390): Item[14:itemRRR](0)
01-29 14:57:30.814: D/Item(390): Item[10:itemRR](2)
01-29 14:57:30.814: D/Item(390): Item[2:itemR](2)
01-29 14:57:30.824: D/Item(390): Item[0:item](2)
01-29 14:57:30.884: I/dalvikvm(390): Could not find method java.lang.String.isEmpty, referenced from method net.arnx.jsonic.JSON$Context.getGetProperties
01-29 14:57:30.884: W/dalvikvm(390): VFY: unable to resolve virtual method 151: Ljava/lang/String;.isEmpty ()Z
01-29 14:57:30.884: D/dalvikvm(390): VFY: replacing opcode 0x6e at 0x007b
01-29 14:57:30.894: I/dalvikvm(390): Could not find method java.lang.String.isEmpty, referenced from method net.arnx.jsonic.JSON$Context.getGetProperties
01-29 14:57:30.894: W/dalvikvm(390): VFY: unable to resolve virtual method 151: Ljava/lang/String;.isEmpty ()Z
01-29 14:57:30.894: D/dalvikvm(390): VFY: replacing opcode 0x6e at 0x00d2
01-29 14:57:30.904: D/dalvikvm(390): VFY: dead code 0x007e-00a3 in Lnet/arnx/jsonic/JSON$Context;.getGetProperties (Ljava/lang/Class;)Ljava/util/List;
01-29 14:57:30.904: D/dalvikvm(390): VFY: dead code 0x00d5-0115 in Lnet/arnx/jsonic/JSON$Context;.getGetProperties (Ljava/lang/Class;)Ljava/util/List;
01-29 14:57:30.904: D/dalvikvm(390): VFY: dead code 0x0159-0168 in Lnet/arnx/jsonic/JSON$Context;.getGetProperties (Ljava/lang/Class;)Ljava/util/List;
01-29 14:57:30.944: D/JSON(390): {"child":[{"child":[{"child":[{"child":[],"id":5,"name":"itemLLL"},{"child":[],"id":6,"name":"itemLLR"}],"id":3,"name":"itemLL"},{"child":[{"child":[],"id":7,"name":"itemLRL"},{"child":[],"id":8,"name":"itemLRR"}],"id":4,"name":"itemLR"}],"id":1,"name":"itemL"},{"child":[{"child":[{"child":[],"id":11,"name":"itemRLL"},{"child":[],"id":12,"name":"itemRLR"}],"id":9,"name":"itemRL"},{"child":[{"child":[],"id":13,"name":"itemRRL"},{"child":[],"id":14,"name":"itemRRR"}],"id":10,"name":"itemRR"}],"id":2,"name":"itemR"}],"id":0,"name":"item"}