Java-JSONICが使えた! | サラリーマンのすらすらIT日記 サラリーマンのすらすらIT日記 Java-JSONICが使えた!
FC2ブログ

サラリーマンのすらすらIT日記

IT関連を中心とした日々を綴ります。
2010/03/20

Java-JSONICが使えた!

昨日の記事で、JSONICがうまく使えないと書きましたが、何とか使えるようになりました。備忘録の意味も込めて、ここに書いておきます。

昨日掲げたデータを前提に説明します。

まず、クラスKobanを作成しておきます。

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) {}
}

とかが一番スマートなやり方かな、と思います。
2010/03/30(火) 09:21:56 |URL|arn #- [編集]
コメントありがとうございます。いつもブログをご覧いただきありがとうございます。
返事が遅れてすみません。

今回作っているシステムではクライアント側のExt JSで"rows"を含まない形での処理にしてしまいました。

今後作るシステムで、教えていただいたやり方を盛り込んでみるつもりです。

製作者直々のコメントで大変うれしく思っています。JSONICはすばらしいですね。また利用させていただきます。
2010/04/07(水) 23:19:18 |URL|sookibizviz #W1x1ne9I [編集]

コメントの投稿

  • URL
  • コメント
  • パスワード
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL:http://sookibizviz.blog81.fc2.com/tb.php/408-3d860867

■  カレンダー

10 | 2024/11 | 12
- - - - - 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

■  プロフィール

sookibizviz

Author:sookibizviz
仕事の内容やソフトの紹介を交えながら、日々の悪戦苦闘を綴っていきます。

■  最新記事

■  最新コメント

■  最新トラックバック

■  月別アーカイブ

■  カテゴリ

未分類 (64)
BizViz (24)
IT (1119)
計量 (76)
環境 (26)
数学 (181)
ニュース (46)
本 (187)
音楽 (113)
囲碁 (5)
将棋 (26)
ブログ (14)
日記 (19)

■  FC2カウンター

■  検索フォーム

■  RSSリンクの表示

■  QRコード

QRコード