質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Java

    14410questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSON

    1232questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Gsonの使い方

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 920

choonesu

score 3

以下のようなJsonをAPIで取得し、Gsonでjavaオブジェクトに変換したいのですが
resultsの値がnullになります。
ご教授お願いします。

{
"0": {
"link": "https://www.meetup.com/Tokyo-Food-Lovers-30/events/236933419/",
"visibility": "public_limited",
"group": {
"created": 1405233751000,
"name": "Tokyo Food Lovers 30+",
"id": 15675462,
"join_mode": "approval",
"lat": 35.66999816894531,
"lon": 139.77000427246094,
"urlname": "Tokyo-Food-Lovers-30",
"who": "Food Lovers"
},
},
"1": {
"link": "https://www.meetup.com/Tokyo-International-Dance-Community/events/237077808/",
"visibility": "public_limited",
"group": {
"created": 1479712391000,
"name": "International Dance & Community. Tokyo young-mid",
"id": 21243196,
"join_mode": "approval",
"lat": 35.66999816894531,
"lon": 139.77000427246094,
"urlname": "Tokyo-International-Dance-Community",
"who": "Beautiful Dancers"
},
}
class MeetUpResponse {

    public Map<String, App> appMap;

     class App {
        public String link;
        public String visivility;
        public Group group;
    }

    class Group {
        public int created;
        public String name;
        public int id;
        public String join_mode;
        public int lat;
        public int lot;
        public String urlname;
        public String who;
    }
}
                final InputStreamReader inReader = new InputStreamReader(con.getInputStream(), "UTF-8");
                JsonReader reader = new JsonReader(inReader);
                Gson gson = new Gson();
                Type collectionType = new TypeToken<List<MeetUpResponse>>(){}.getType();
                List<MeetUpResponse> results = gson.fromJson(reader, collectionType);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ご質問のコードでやってみると自分の方ではfromJsonでJsonSyntaxExceptionが起きました。質問者さんのコードでは読み込めたのでしょうか?

ご質問にあるJsonは以下の形式ですが・・・

JSON-1 (要求されている形式)

{
  "0": { ... },
  "1": { ... }
}

この"0"や"1"が決まったパターンでしかないなら@SerializedNameアノテーションを使ってJavaのフィールド名とマッピングすればよいと思いますが、これがMapのキーのように可変値の場合はJavaのフィールドへマッピングするのではなくMapのキーとして扱うことになろうかと思います。Gsonに用意されているデフォルトマッピングのみを使うなら以下のJSON-2の形式とすれば変換できます。

JSON-2 (GsonのデフォルトデシリアライザーがMapとして受け付けるJSON形式)

[
  { "0": { ... }},
  { "1": { ... }}
]

おそらくJsonありきの話なのでJSON-1の形式をどのようにJavaオブジェクトへマッピングすればよいかが問題なのだと思います。GsonにもJsonにも暗いのであてずっぽうですが、JSON-1をMapとして読み込まなければならないのだとしたらデシリアライザーをカスタマイズする必要がある気がしました。

以下の記事は本家のページではないですが本家ユーザーガイドを翻訳したもののようなので読みやすく・参考にできると思います。

Gson User Guide を和訳

なお非staticな内部クラスは使わない方が無難だと思います。そうすることも可能ですが不必要に手間がかかるみたいですし非推奨らしいです(上の翻訳ページにそうありました)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

そもそもレスポンスのjsonが不正な形式なので上手くパース出来ないのでしょう。
14行目と28行目の「,」は不要です。また最後の行に「}」も必要です。
あともモデルクラスも少し違う気がします。私がjsonschema2pojoというさいとでjson→pojo変換をかけてみたところ以下のようになりました。参考までにどうぞ。

-----------------------------------com.example.Example.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Example {

@SerializedName("0")
@Expose
private com.example._0 _0;
@SerializedName("1")
@Expose
private com.example._1 _1;

public com.example._0 get0() {
return _0;
}

public void set0(com.example._0 _0) {
this._0 = _0;
}

public com.example._1 get1() {
return _1;
}

public void set1(com.example._1 _1) {
this._1 = _1;
}

}
-----------------------------------com.example.Group.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Group {

@SerializedName("created")
@Expose
private Integer created;
@SerializedName("name")
@Expose
private String name;
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("join_mode")
@Expose
private String joinMode;
@SerializedName("lat")
@Expose
private Double lat;
@SerializedName("lon")
@Expose
private Double lon;
@SerializedName("urlname")
@Expose
private String urlname;
@SerializedName("who")
@Expose
private String who;

public Integer getCreated() {
return created;
}

public void setCreated(Integer created) {
this.created = created;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getJoinMode() {
return joinMode;
}

public void setJoinMode(String joinMode) {
this.joinMode = joinMode;
}

public Double getLat() {
return lat;
}

public void setLat(Double lat) {
this.lat = lat;
}

public Double getLon() {
return lon;
}

public void setLon(Double lon) {
this.lon = lon;
}

public String getUrlname() {
return urlname;
}

public void setUrlname(String urlname) {
this.urlname = urlname;
}

public String getWho() {
return who;
}

public void setWho(String who) {
this.who = who;
}

}
-----------------------------------com.example.Group_.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Group_ {

@SerializedName("created")
@Expose
private Integer created;
@SerializedName("name")
@Expose
private String name;
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("join_mode")
@Expose
private String joinMode;
@SerializedName("lat")
@Expose
private Double lat;
@SerializedName("lon")
@Expose
private Double lon;
@SerializedName("urlname")
@Expose
private String urlname;
@SerializedName("who")
@Expose
private String who;

public Integer getCreated() {
return created;
}

public void setCreated(Integer created) {
this.created = created;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getJoinMode() {
return joinMode;
}

public void setJoinMode(String joinMode) {
this.joinMode = joinMode;
}

public Double getLat() {
return lat;
}

public void setLat(Double lat) {
this.lat = lat;
}

public Double getLon() {
return lon;
}

public void setLon(Double lon) {
this.lon = lon;
}

public String getUrlname() {
return urlname;
}

public void setUrlname(String urlname) {
this.urlname = urlname;
}

public String getWho() {
return who;
}

public void setWho(String who) {
this.who = who;
}

}
-----------------------------------com.example._0.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class _0 {

@SerializedName("link")
@Expose
private String link;
@SerializedName("visibility")
@Expose
private String visibility;
@SerializedName("group")
@Expose
private Group group;

public String getLink() {
return link;
}

public void setLink(String link) {
this.link = link;
}

public String getVisibility() {
return visibility;
}

public void setVisibility(String visibility) {
this.visibility = visibility;
}

public Group getGroup() {
return group;
}

public void setGroup(Group group) {
this.group = group;
}

}
-----------------------------------com.example._1.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class _1 {

@SerializedName("link")
@Expose
private String link;
@SerializedName("visibility")
@Expose
private String visibility;
@SerializedName("group")
@Expose
private Group_ group;

public String getLink() {
return link;
}

public void setLink(String link) {
this.link = link;
}

public String getVisibility() {
return visibility;
}

public void setVisibility(String visibility) {
this.visibility = visibility;
}

public Group_ getGroup() {
return group;
}

public void setGroup(Group_ group) {
this.group = group;
}

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/11 18:12

    質問にあるJsonは間違いを含みますが、単にAPIが返す形式を示しているだけだと解釈し自分は余分なカンマや不足している'}'は補いました。また、MeetUpResponseクラスのappMapというフィールドがJsonにマッピングのない宣言ですので本来はフィールドでなくMeetUpResponse extends Map<String, App>とでもすべきと思ったのですが、いずれにせよそれらは重要なポイントではないと解釈しました。json→pojoの結果を拝見しましたが"0","1"が単なるフィールドにマッピングされています。それでよいなら苦労はないのでしょうが、自分はこれらは固定的なフィールドにマッピングしたいのではないと解釈しました。ゆえにこのJsonがGsonのMap用のデフォルトシリアライザーとは適合しない点がポイントだと考え上のような回答をしてみた次第です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14410questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSON

    1232questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。