- [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"}
