忍者ブログ

2007/03/04開始。ソフトウェア管理やDelerer SEの作者であるおにぎりくんの試行錯誤の記録です。
2024
前の月へ 10 : 123456789101112131415161718192021222324252627282930 : 12 次の月へ
83  82  81  80  79  78  77  76  75  74  73 
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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

PR
スポンサード・リンク
この記事にコメントする
Name
Title
Color
Mail
URL
Comment
Pass Vodafone絵文字 i-mode絵文字 Ezweb絵文字
フリーソフト指向::開発日記 by LapisCactus
忍者ブログ | [PR]

今日の聖書
自己紹介
名前:
LapisCactus (おにぎりくん)
Twitter:
Mail:
onigirikun_hsp@hotmail.com
自己紹介:
ふつうのしすてむえんじにあ。
趣味で「ソフトウェア管理」や
「TextView」を作っています。
仕事でもコンピュータを触っているのに
趣味も同じという。
健康に悪いですね。
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
ブログ内検索
最新CM
[03/03 kusakari]
[11/12 おにぎりくん]
[11/08 れい]
アクセス解析