2010/03/20
Java-JSONICが使えた!
昨日の記事で、JSONICがうまく使えないと書きましたが、何とか使えるようになりました。備忘録の意味も込めて、ここに書いておきます。
昨日掲げたデータを前提に説明します。
昨日掲げたデータを前提に説明します。
まず、クラスKobanを作成しておきます。
一応、setter,getterを設定しましたが、使いませんでした^^;)。次にmapを設定します。
次に昨日掲げたデータを少し変えます。先頭にrows:があるとうまくいきませんでした。
ファイルから読み出すようにしてテストすると簡単なので、上記のJSON形式データをC:\data.jsonとしてファイル保存します。Javaプログラムには、次のようにimport指定をしておきます(import java.io.*でも可)。
データを読み込みます。今回はデータに改行コードが入っていませんが、将来見やすさのためにJSON形式ファイルに改行コードを入れた場合を想定してwhileでループします。
デコード処理を行います。
mapを知らなかったため苦労しましたが、何とかできました。わかってみれば、JSONICは難しくありません。
以下のサイトを参考にさせていただきました。
「Java Map/HashMapよくある使い方」
「Javaの入出力(Stream)について」
JSONICの使い方を説明したサイトは数多くありましたが、mapを使った例は調べた限りどこにも見つかりませんでした。JSONデータを扱うからには、mapのようなキーと値を持ったデータが必要だと思うのですが...
private static class Koban {
String koban, name, kubun;
}
一応、setter,getterを設定しましたが、使いませんでした^^;)。次にmapを設定します。
Map map = new HashMap();
次に昨日掲げたデータを少し変えます。先頭にrows:があるとうまくいきませんでした。
[{"koban":"201","name":"Java","kubun":"medium"}
,{"koban":"202","name":"PL/I",kubun":"bad"}
,{"koban":"203","name":"JavaScript",kubun":"good"}]
ファイルから読み出すようにしてテストすると簡単なので、上記のJSON形式データをC:\data.jsonとしてファイル保存します。Javaプログラムには、次のようにimport指定をしておきます(import java.io.*でも可)。
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
データを読み込みます。今回はデータに改行コードが入っていませんが、将来見やすさのためにJSON形式ファイルに改行コードを入れた場合を想定してwhileでループします。
FileInputStream in = new FileInputStream("C:\\data.json");
InputStreamReader sr = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(sr);
String text = "", line;
while ((line = br.readLine()) != null) {
text += line;
}
デコード処理を行います。
ArrayList<Koban> kobanList = new ArrayList<Koban>(); // クラスKobanを格納するArrayListを生成
kobanList.addAll(JSON.decode(text, kobanList.getClass())); // JSONICでファイル全体の文字列をデコードし、上記ArrayListに放り込む
for (int i=0; i<kobanList.size(); i++) {
map = (Map)kobanList.get(i); // ArrayListの要素1つずつをmapに代入
Set keySet = map.keySet(); //すべてのキー値を取得
Iterator keyIte = keySet.iterator(); // キーのイテレータを設定
while(keyIte.hasNext()) {
Object key = keyIte.next(); // キーを得る
Object value = map.get(key); // そのキーに対応するデータを得る
System.out.println(key + "=" + value);
}
}
mapを知らなかったため苦労しましたが、何とかできました。わかってみれば、JSONICは難しくありません。
以下のサイトを参考にさせていただきました。
「Java Map/HashMapよくある使い方」
「Javaの入出力(Stream)について」
JSONICの使い方を説明したサイトは数多くありましたが、mapを使った例は調べた限りどこにも見つかりませんでした。JSONデータを扱うからには、mapのようなキーと値を持ったデータが必要だと思うのですが...
コメント
JSONICを開発しているものです。JSONICはJSON objectをMapかJavaBeanに変換するので、先頭にrowsがあるのであれば、
class Row {
public String koban;
public String name;
public String kubun;
}
class Data {
public List<Row> rows;
}
というクラスを用意し
InputStream in = null;
try {
in = new FileInputStream("C:\data.json");
Data data = JSON.decode(in, Data.class);
for (Row row : data.rows) {
System.out.println(row.koban + ", " + row.name + ", " + row.kubun);
}
} finally {
try {
if (in != null) in.close();
} catch (Exception e) {}
}
とかが一番スマートなやり方かな、と思います。
class Row {
public String koban;
public String name;
public String kubun;
}
class Data {
public List<Row> rows;
}
というクラスを用意し
InputStream in = null;
try {
in = new FileInputStream("C:\data.json");
Data data = JSON.decode(in, Data.class);
for (Row row : data.rows) {
System.out.println(row.koban + ", " + row.name + ", " + row.kubun);
}
} finally {
try {
if (in != null) in.close();
} catch (Exception e) {}
}
とかが一番スマートなやり方かな、と思います。
コメントありがとうございます。いつもブログをご覧いただきありがとうございます。
返事が遅れてすみません。
今回作っているシステムではクライアント側のExt JSで"rows"を含まない形での処理にしてしまいました。
今後作るシステムで、教えていただいたやり方を盛り込んでみるつもりです。
製作者直々のコメントで大変うれしく思っています。JSONICはすばらしいですね。また利用させていただきます。
返事が遅れてすみません。
今回作っているシステムではクライアント側のExt JSで"rows"を含まない形での処理にしてしまいました。
今後作るシステムで、教えていただいたやり方を盛り込んでみるつもりです。
製作者直々のコメントで大変うれしく思っています。JSONICはすばらしいですね。また利用させていただきます。
コメントの投稿
トラックバック
トラックバックURL:http://sookibizviz.blog81.fc2.com/tb.php/408-3d860867