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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

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

Java

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

Q&A

解決済

2回答

3695閲覧

Gsonの使い方

choonesu

総合スコア11

JSON

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

Java

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

0グッド

0クリップ

投稿2017/02/11 04:18

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

json

1{ 2"0": { 3"link": "https://www.meetup.com/Tokyo-Food-Lovers-30/events/236933419/", 4"visibility": "public_limited", 5"group": { 6"created": 1405233751000, 7"name": "Tokyo Food Lovers 30+", 8"id": 15675462, 9"join_mode": "approval", 10"lat": 35.66999816894531, 11"lon": 139.77000427246094, 12"urlname": "Tokyo-Food-Lovers-30", 13"who": "Food Lovers" 14}, 15}, 16"1": { 17"link": "https://www.meetup.com/Tokyo-International-Dance-Community/events/237077808/", 18"visibility": "public_limited", 19"group": { 20"created": 1479712391000, 21"name": "International Dance & Community. Tokyo young-mid", 22"id": 21243196, 23"join_mode": "approval", 24"lat": 35.66999816894531, 25"lon": 139.77000427246094, 26"urlname": "Tokyo-International-Dance-Community", 27"who": "Beautiful Dancers" 28}, 29}

java

1class MeetUpResponse { 2 3 public Map<String, App> appMap; 4 5 class App { 6 public String link; 7 public String visivility; 8 public Group group; 9 } 10 11 class Group { 12 public int created; 13 public String name; 14 public int id; 15 public String join_mode; 16 public int lat; 17 public int lot; 18 public String urlname; 19 public String who; 20 } 21}

java

1 final InputStreamReader inReader = new InputStreamReader(con.getInputStream(), "UTF-8"); 2 JsonReader reader = new JsonReader(inReader); 3 Gson gson = new Gson(); 4 Type collectionType = new TypeToken<List<MeetUpResponse>>(){}.getType(); 5 List<MeetUpResponse> results = gson.fromJson(reader, collectionType);

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

JAVA

1-----------------------------------com.example.Example.java----------------------------------- 2 3package com.example; 4 5import com.google.gson.annotations.Expose; 6import com.google.gson.annotations.SerializedName; 7 8public class Example { 9 10@SerializedName("0") 11@Expose 12private com.example._0 _0; 13@SerializedName("1") 14@Expose 15private com.example._1 _1; 16 17public com.example._0 get0() { 18return _0; 19} 20 21public void set0(com.example._0 _0) { 22this._0 = _0; 23} 24 25public com.example._1 get1() { 26return _1; 27} 28 29public void set1(com.example._1 _1) { 30this._1 = _1; 31} 32 33} 34-----------------------------------com.example.Group.java----------------------------------- 35 36package com.example; 37 38import com.google.gson.annotations.Expose; 39import com.google.gson.annotations.SerializedName; 40 41public class Group { 42 43@SerializedName("created") 44@Expose 45private Integer created; 46@SerializedName("name") 47@Expose 48private String name; 49@SerializedName("id") 50@Expose 51private Integer id; 52@SerializedName("join_mode") 53@Expose 54private String joinMode; 55@SerializedName("lat") 56@Expose 57private Double lat; 58@SerializedName("lon") 59@Expose 60private Double lon; 61@SerializedName("urlname") 62@Expose 63private String urlname; 64@SerializedName("who") 65@Expose 66private String who; 67 68public Integer getCreated() { 69return created; 70} 71 72public void setCreated(Integer created) { 73this.created = created; 74} 75 76public String getName() { 77return name; 78} 79 80public void setName(String name) { 81this.name = name; 82} 83 84public Integer getId() { 85return id; 86} 87 88public void setId(Integer id) { 89this.id = id; 90} 91 92public String getJoinMode() { 93return joinMode; 94} 95 96public void setJoinMode(String joinMode) { 97this.joinMode = joinMode; 98} 99 100public Double getLat() { 101return lat; 102} 103 104public void setLat(Double lat) { 105this.lat = lat; 106} 107 108public Double getLon() { 109return lon; 110} 111 112public void setLon(Double lon) { 113this.lon = lon; 114} 115 116public String getUrlname() { 117return urlname; 118} 119 120public void setUrlname(String urlname) { 121this.urlname = urlname; 122} 123 124public String getWho() { 125return who; 126} 127 128public void setWho(String who) { 129this.who = who; 130} 131 132} 133-----------------------------------com.example.Group_.java----------------------------------- 134 135package com.example; 136 137import com.google.gson.annotations.Expose; 138import com.google.gson.annotations.SerializedName; 139 140public class Group_ { 141 142@SerializedName("created") 143@Expose 144private Integer created; 145@SerializedName("name") 146@Expose 147private String name; 148@SerializedName("id") 149@Expose 150private Integer id; 151@SerializedName("join_mode") 152@Expose 153private String joinMode; 154@SerializedName("lat") 155@Expose 156private Double lat; 157@SerializedName("lon") 158@Expose 159private Double lon; 160@SerializedName("urlname") 161@Expose 162private String urlname; 163@SerializedName("who") 164@Expose 165private String who; 166 167public Integer getCreated() { 168return created; 169} 170 171public void setCreated(Integer created) { 172this.created = created; 173} 174 175public String getName() { 176return name; 177} 178 179public void setName(String name) { 180this.name = name; 181} 182 183public Integer getId() { 184return id; 185} 186 187public void setId(Integer id) { 188this.id = id; 189} 190 191public String getJoinMode() { 192return joinMode; 193} 194 195public void setJoinMode(String joinMode) { 196this.joinMode = joinMode; 197} 198 199public Double getLat() { 200return lat; 201} 202 203public void setLat(Double lat) { 204this.lat = lat; 205} 206 207public Double getLon() { 208return lon; 209} 210 211public void setLon(Double lon) { 212this.lon = lon; 213} 214 215public String getUrlname() { 216return urlname; 217} 218 219public void setUrlname(String urlname) { 220this.urlname = urlname; 221} 222 223public String getWho() { 224return who; 225} 226 227public void setWho(String who) { 228this.who = who; 229} 230 231} 232-----------------------------------com.example._0.java----------------------------------- 233 234package com.example; 235 236import com.google.gson.annotations.Expose; 237import com.google.gson.annotations.SerializedName; 238 239public class _0 { 240 241@SerializedName("link") 242@Expose 243private String link; 244@SerializedName("visibility") 245@Expose 246private String visibility; 247@SerializedName("group") 248@Expose 249private Group group; 250 251public String getLink() { 252return link; 253} 254 255public void setLink(String link) { 256this.link = link; 257} 258 259public String getVisibility() { 260return visibility; 261} 262 263public void setVisibility(String visibility) { 264this.visibility = visibility; 265} 266 267public Group getGroup() { 268return group; 269} 270 271public void setGroup(Group group) { 272this.group = group; 273} 274 275} 276-----------------------------------com.example._1.java----------------------------------- 277 278package com.example; 279 280import com.google.gson.annotations.Expose; 281import com.google.gson.annotations.SerializedName; 282 283public class _1 { 284 285@SerializedName("link") 286@Expose 287private String link; 288@SerializedName("visibility") 289@Expose 290private String visibility; 291@SerializedName("group") 292@Expose 293private Group_ group; 294 295public String getLink() { 296return link; 297} 298 299public void setLink(String link) { 300this.link = link; 301} 302 303public String getVisibility() { 304return visibility; 305} 306 307public void setVisibility(String visibility) { 308this.visibility = visibility; 309} 310 311public Group_ getGroup() { 312return group; 313} 314 315public void setGroup(Group_ group) { 316this.group = group; 317} 318 319}

投稿2017/02/11 08:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/02/11 09:12

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

0

ベストアンサー

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

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

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

json

1{ 2 "0": { ... }, 3 "1": { ... } 4}

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

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

json

1[ 2 { "0": { ... }}, 3 { "1": { ... }} 4]

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

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

Gson User Guide を和訳

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

投稿2017/02/11 06:48

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問