JsonPullParserの使い方に関して教えてください

閲覧: 687 回
最初の未読メッセージにスキップ

kimukou buzz

未読、
2012/10/10 21:39:452012/10/10
To: jsonpullpa...@googlegroups.com
お忙しいところ大変御迷惑をおかけいたします

現在
JPPをtwitpicで試そうとしているのですが
 http://api.twitpic.com/2/tags/show.json?tag=nyaruko&page=1
でimagesをとりたい場合

-----------------------------------------------------
{
  • id: "1821514",
  • name: "nyaruko",
  • images:
    [
    • {
    • },
    • {
    • }
-----------------------------------------------------
のJSON形式の場合


1)自作TokenConverterを実装するイメージなのか
 TokenConverterのサンプルは見ましたが、実際想定されているJSONの形が想像できなかったのでイマイチぴんときませんでした(すみません) 
2)imagesの部分を起点にしてマッピングする方法があるのか
3)下記のようなbeansを定義した上でimagesの部分をプログラム手法でどうにかできるのか

@JsonModel(decamelize = false)

public class TwitPicRootBean {

@JsonKey

private long id;

@JsonKey

private String name;

@JsonKey

private List<TwitPicBean> images;

}

御教授いただけると幸いです
できればAndroid版のtwサンプルのようにimagesの箇所の逐次読込=>表示 を行いたいと思っております

vvakame

未読、
2012/10/10 22:37:032012/10/10
To: jsonpullpa...@googlegroups.com
製作者のわかめです。

方法としては "2 imagesの部分を起点にしてマッピングする方法がある" が正しいです。
データ全体が http://pastebin.com/sk08fi9p こんな感じで、"images" の場所の配列の1要素を抜き出すと
http://pastebin.com/EF8kbijE のようになっています。
このデータをPOJOにマッピングするには、3つ程クラスを作成すると良いと思います。
1. TwitPicRootクラス
2. TwitPicImageクラス (TwitPicRoot の images 配列の1要素に相当)
3. TwitPicUserクラス (TwitPicImage の user の値に相当)

List<TwitPicImage> images; というフィールドを持ちたい場合、TwitPicImage
クラスにも@JsonModelアノテーションを付けるだけで大丈夫です。
参考例として以下の2つを見てみてください。
https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-usage/src/main/java/net/vvakame/sample/ComplexData.java#L41
https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-usage/src/main/java/net/vvakame/sample/TestData.java#L26

2012年10月11日 10:39 kimukou buzz <kimuko...@gmail.com>:
> --
> このメールは Google グループのグループ「JsonPullParser-Japan」の登録者に送られています。
> このグループから退会するには、jsonpullparser-j...@googlegroups.com
> にメールを送信してください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

kimukou buzz

未読、
2012/10/11 8:44:232012/10/11
To: JsonPullParser-Japan
御返答ありがとうございます。
JSONのマッピング自体は認識に相違ないのは確認できました。
ありがとうございます。

https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-android-sample/src/net/vvakame/jsonpullparser/android/sample/MainActivity.java

のTweetDownloadTaskの用な物を実装しようとした場合
逐次読み込みであれば
 TwitPicImageGenerated.getList(urlConnection.getInputStream(),
listener);
という形が出来ると思ったのですが、その認識で相違ありませんでしょうか?

それとも
 TwitPicRootGenerated.getList(urlConnection.getInputStream(),
listener);
という形で読み込ませて
mAdapter.add(TwitPicImage)
みたいな事は可能なのでしょうか?


On 10月11日, 午前11:37, vvakame <vvak...@gmail.com> wrote:
> 製作者のわかめです。
>
> 方法としては "2 imagesの部分を起点にしてマッピングする方法がある" が正しいです。
> データ全体がhttp://pastebin.com/sk08fi9pこんな感じで、"images" の場所の配列の1要素を抜き出すとhttp://pastebin.com/EF8kbijEのようになっています。
> このデータをPOJOにマッピングするには、3つ程クラスを作成すると良いと思います。
> 1. TwitPicRootクラス
> 2. TwitPicImageクラス (TwitPicRoot の images 配列の1要素に相当)
> 3. TwitPicUserクラス (TwitPicImage の user の値に相当)
>
> List<TwitPicImage> images; というフィールドを持ちたい場合、TwitPicImage
> クラスにも@JsonModelアノテーションを付けるだけで大丈夫です。
> 参考例として以下の2つを見てみてください。https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-...https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-...
>
> 2012年10月11日 10:39 kimukou buzz <kimukou.b...@gmail.com>:

kimukou buzz

未読、
2012/10/11 22:02:392012/10/11
To: JsonPullParser-Japan
追加でもう一つ質問させて頂きます
模範でみせて頂いたものはunicodeで変換されている形のようですが

InputStreamReader reader = new
InputStreamReader(urlConnection.getInputStream(), "UTF-8");
TwitPicRootGenerated.getList(reader, listener);

のような形にする方法を自分で実装しようとすると結構難しいでしょうか?
現状だとInputStream と Stringの口しかないように見受けられるので・・


On 10月11日, 午後9:44, kimukou buzz <kimukou.b...@gmail.com> wrote:
> 御返答ありがとうございます。
> JSONのマッピング自体は認識に相違ないのは確認できました。
> ありがとうございます。
>
> https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-...
>
> のTweetDownloadTaskの用な物を実装しようとした場合
> 逐次読み込みであれば
>  TwitPicImageGenerated.getList(urlConnection.getInputStream(),
> listener);
> という形が出来ると思ったのですが、その認識で相違ありませんでしょうか?
>
> それとも
>  TwitPicRootGenerated.getList(urlConnection.getInputStream(),
> listener);
> という形で読み込ませて
> mAdapter.add(TwitPicImage)
> みたいな事は可能なのでしょうか?
>
> On 10月11日, 午前11:37, vvakame <vvak...@gmail.com> wrote:
>
>
>
>
>
>
>
> > 製作者のわかめです。
>
> > 方法としては "2 imagesの部分を起点にしてマッピングする方法がある" が正しいです。
> > データ全体がhttp://pastebin.com/sk08fi9pこんな感じで、"images" の場所の配列の1要素を抜き出すとhttp://pastebin.com/EF8kbijEのようになっています。
> > このデータをPOJOにマッピングするには、3つ程クラスを作成すると良いと思います。
> > 1. TwitPicRootクラス
> > 2. TwitPicImageクラス (TwitPicRoot の images 配列の1要素に相当)
> > 3. TwitPicUserクラス (TwitPicImage の user の値に相当)
>
> > List<TwitPicImage> images; というフィールドを持ちたい場合、TwitPicImage
> > クラスにも@JsonModelアノテーションを付けるだけで大丈夫です。
> > 参考例として以下の2つを見てみてください。https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-......

vvakame

未読、
2012/10/11 22:12:312012/10/11
To: jsonpullpa...@googlegroups.com
製作者のわかめです。

JsonPullParser自体はAndroidのための仕組みを特別に提供しているわけではありません。
kimukouさんの言っている前者の方法で逐次読み込み出来るはずです。サンプルコードのまんまで大丈夫なはずです。

何がやりたいのかちょっと良くわからないですが、今回の場合は逐次読み込みを行わなくても大丈夫なんじゃないかなーと思います。
最近の端末は十分早いので、JSONのパースは一瞬で終わるでしょう。
画像の読み込みのフェーズを非同期的に行うような実装にしてやるだけでビューワとしては十分なのではないかと思います。

2012年10月11日 21:44 kimukou buzz <kimuko...@gmail.com>:

vvakame

未読、
2012/10/11 22:15:032012/10/11
To: jsonpullpa...@googlegroups.com
製作者のわかめです。

InputStream, String の他に JsonPullParserクラスのインスタンスを取れるようになっています。
https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-apt/src/main/resources/JsonModelGen.java.mvel#L93

JsonPullParserクラス自体には、Readerを受け取ったり、InputStreamとCharsetを元にできるようなAPIがあります。
https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-core/src/main/java/net/vvakame/util/jsonpullparser/JsonPullParser.java#L234

この2つを組み合わせれば大丈夫だと思います。
なお、JsonPullParserではInputStreamは何もしなければUTF-8として処理されます。

2012年10月12日 11:02 kimukou buzz <kimuko...@gmail.com>:

kimukou buzz

未読、
2012/10/11 22:23:552012/10/11
To: JsonPullParser-Japan
度々すみません。
 https://gist.github.com/3876967
のような実装をしていて、文字コードの判定のせいで失敗かなと思ってしまっていましたが
原因的に違うような気がしますので
このような実装で認識があっているか確認させてください。

なにか足りない実装があれば御指摘いただけると幸いです。
御手数をおかけいたしますがよろしくお願いいたします。

Masato Sasaki

未読、
2012/10/11 22:32:132012/10/11
To: jsonpullpa...@googlegroups.com
こんにちは

横から失礼します。りんごです。

APIが返しているのが、TwitPicImageBeanの配列なので
TwitPicRootBeanGererated.getList
ではなく
TwitPicImageBeanGererated.getList
とするべきではないかと思います。


2012年10月12日金曜日 11時23分57秒 UTC+9 kimukou buzz:
> > > > このグループから退会するには、jsonpullparser-japan+unsubscribe@googlegroups.com
> > > > にメールを送信してください。
> > > > その他のオプションについては、https://groups.google.com/groups/opt_outにアクセスしてください。

mstssk

未読、
2012/10/11 22:39:202012/10/11
To: jsonpullpa...@googlegroups.com
りんごです。

連投すみません。
先ほどの返信、間違えていました。

APIが返している内容が
TwitPicImageBean の配列を持った1つのTwitPicRootBean
なので、
TwitPicRootBeanGererated.getList
ではなく、
TwitPicRootBeanGererated.get
ではないかと思います。


2012年10月12日 11:32 Masato Sasaki <mst...@gmail.com>:
>> > > > > このグループから退会するには、jsonpullparser-j...@googlegroups.com
>> > > > > にメールを送信してください。
>> > > > >
>> > > > > その他のオプションについては、https://groups.google.com/groups/opt_outにアクセスしてください。
>
> --
> このメールは Google グループのグループ「JsonPullParser-Japan」の登録者に送られています。

kimukou buzz

未読、
2012/10/11 22:40:002012/10/11
To: JsonPullParser-Japan
アドバイスありがとうございます。

試しに
1)
JsonPullParser parser =
JsonPullParser.newParser(urlConnection.getInputStream(),
"ISO-8859-1");
TwitPicImageBeanGererated.getList(parser,listener);

2)
JsonPullParser parser =
JsonPullParser.newParser(urlConnection.getInputStream(), "UTF-8");
TwitPicImageBeanGererated.getList(parser,listener);

3)
TwitPicImageBeanGererated.getList(urlConnection.getInputStream(),
listener);

の形で書いてみましたが どれもエラーは変わらず、はまっています・・。
> > > > > > このグループから退会するには、jsonpullparser-j...@googlegroups.com<javascript :>
> > > > > > にメールを送信してください。
> > > > > > その他のオプションについては、https://groups.google.com/groups/opt_outにアクセスしてください。

kimukou buzz

未読、
2012/10/11 22:57:252012/10/11
To: JsonPullParser-Japan
りんごさん

TwitPicRootBeanGererated.get でエラーは出なくなりました。
アドバイスありがとうございます。
ただマッピングされているはずのものがすべて nullが返って来てしまっているようで
なにがおかしいのか現在見なおしています

kimukou buzz

未読、
2012/10/11 23:00:402012/10/11
To: JsonPullParser-Japan
あと
TwitPicRootBeanGererated.get
としてしまうと1つしか帰ってこないような気がするのですが気のせいなのでしょうか?
(JSONを見る限り10個はかえってくるはず

vvakame

未読、
2012/10/11 23:00:262012/10/11
To: jsonpullpa...@googlegroups.com
わかめです。

デフォルトだと、マッピングに失敗したJSONの値は単に読み捨てられます。
プログラム内で使わない全ての値についてフィールドを用意しなければいけなくなってしまいます。
そこで treatUnknownKeyAsError を使うとマッピングに失敗した場合、例外をあげてくれるようになりますので、これを試してみてください。
こんな感じ。
https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-usage/src/main/java/net/vvakame/sample/ConverterData.java#L31

2012年10月12日 11:57 kimukou buzz <kimuko...@gmail.com>:

kimukou buzz

未読、
2012/10/11 23:05:572012/10/11
To: JsonPullParser-Japan

net.vvakame.util.jsonpullparser.JsonFormatException: unsupported key.
key=id
がでました。
対象のJSONに「id 」というキーが設定されているためのようです
回避方法があれば是非アドバイスを頂きたく

On 10月12日, 午後12:00, vvakame <vvak...@gmail.com> wrote:
> わかめです。
>
> デフォルトだと、マッピングに失敗したJSONの値は単に読み捨てられます。
> プログラム内で使わない全ての値についてフィールドを用意しなければいけなくなってしまいます。
> そこで treatUnknownKeyAsError を使うとマッピングに失敗した場合、例外をあげてくれるようになりますので、これを試してみてください。
> こんな感じ。https://github.com/vvakame/JsonPullParser/blob/master/jsonpullparser-...
>
> 2012年10月12日 11:57 kimukou buzz <kimukou.b...@gmail.com>:

kimukou buzz

未読、
2012/10/11 23:17:442012/10/11
To: JsonPullParser-Japan
すみません。
凄く馬鹿っぽい質問かもしれないのですが
JPPはJSON上の全部のキーをmapしないと動かない感じなのでしょうか?
(使うものだけ名前を指定すれば動く認識でした )

vvakame

未読、
2012/10/11 23:33:292012/10/11
To: jsonpullpa...@googlegroups.com
わかめです。

TwitPicRootBean root = TwitPicRootBeanGererated.get(略)
assertThat("10個あるのはイメージ", root.getImages().size(), is(10));

こーゆー感じです。

2012年10月12日 12:00 kimukou buzz <kimuko...@gmail.com>:

kimukou buzz

未読、
2012/10/11 23:36:382012/10/11
To: JsonPullParser-Japan
度々申し訳ありません
認識足らずですみません。

idは
@JsonKey
private String id;
を各beanに設定でいけたのですが、

net.vvakame.util.jsonpullparser.JsonFormatException: unsupported key.
key=name
というエラーが出てしまいました。

images直下以外は
@JsonKey
private String name;

と設定している状態です。nameは必須項目でしょうか?
(それとも使ってはいけないkey?)

vvakame

未読、
2012/10/11 23:36:422012/10/11
To: jsonpullpa...@googlegroups.com
わかめです。

先のレスで書きましたが、treatUnknownKeyAsError = true
とした場合、POJOに定義されてないKeyがあると例外があがるようになります。
> デフォルトだと、マッピングに失敗したJSONの値は単に読み捨てられます。
> プログラム内で使わない全ての値についてフィールドを用意しなければいけなくなってしまいます。
> そこで treatUnknownKeyAsError を使うとマッピングに失敗した場合、例外をあげてくれるようになりますので、これを試してみてください。
値がnullになるというのは、マッピングに失敗して読み捨てられているから (マッピングが意図通りに行われていない) です。
なので、マッピングに失敗したら例外をあげるようにすることで、ミスを検知するようにすればいいよ!ということです。
もし、上記対応が嫌な場合は、デバッガでXxxGeneratedのクラス内でパースされていく過程を追っていくのがいいと思います。

2012年10月12日 12:05 kimukou buzz <kimuko...@gmail.com>:

kimukou buzz

未読、
2012/10/12 0:08:252012/10/12
To: JsonPullParser-Japan
https://gist.github.com/3876967
の形で動作を確認できました。

色々と皆様方のアドバイス、サポートを頂き
大変感謝です。本当にありがとうございました。

On 10月12日, 午後12:36, vvakame <vvak...@gmail.com> wrote:
> わかめです。
>
> 先のレスで書きましたが、treatUnknownKeyAsError = true
> とした場合、POJOに定義されてないKeyがあると例外があがるようになります。> デフォルトだと、マッピングに失敗したJSONの値は単に読み捨てられます。
> > プログラム内で使わない全ての値についてフィールドを用意しなければいけなくなってしまいます。
> > そこで treatUnknownKeyAsError を使うとマッピングに失敗した場合、例外をあげてくれるようになりますので、これを試してみてください。
>
> 値がnullになるというのは、マッピングに失敗して読み捨てられているから (マッピングが意図通りに行われていない) です。
> なので、マッピングに失敗したら例外をあげるようにすることで、ミスを検知するようにすればいいよ!ということです。
> もし、上記対応が嫌な場合は、デバッガでXxxGeneratedのクラス内でパースされていく過程を追っていくのがいいと思います。
>
> 2012年10月12日 12:05 kimukou buzz <kimukou.b...@gmail.com>:
> >> > このグループから退会するには、jsonpullparser-j...@googlegroups.com にメールを送信してください。...
>
> もっと読む ≫

vvakame

未読、
2012/10/12 1:17:242012/10/12
To: jsonpullpa...@googlegroups.com
わかめです。

よかったです!!貴重な導入初心者のハマりかたサンプルとして、githubのwikiにノウハウを書いていただけると嬉しいなと思います。

2012年10月12日 13:08 kimukou buzz <kimuko...@gmail.com>:
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>
全員に返信
投稿者に返信
転送
新着メール 0 件