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

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

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

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

Q&A

解決済

1回答

3890閲覧

jacksonを使ってWebAPIから取り出したJSONファイルをJavaオブジェクトにしたい

watarusugimoto

総合スコア47

Java

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

0グッド

0クリップ

投稿2017/06/19 17:57

編集2017/06/20 17:25

###jacksonを使ってWebAPIから取り出したJSONファイルをJavaオブジェクトにしたい
Javaでe-Statという統計のWebAPIから値を取り出したいと考えています。
JSONファイルまでは取り出すことができ、それをJavaオブジェクトに変換するため、jacksonというライブラリを使おうと考えています。
簡単な例題程度の構造であれば、クラスの書き方も分かるのですが、WebAPIが返してきた大量のデータを見てどの様にクラスを定義すれば良いのか分からなくなってしまいました。。
オブジェクトクラスの作成方法はどの様にすれば良いのでしょうか?
乗っているサイト等ありましたら教えてください。
よろしくお願いします。

###試したこと
jacksonの関連のウェブサイトを見ていますが分かりません。

###対象としているJSONファイル
抜粋ですが、以下のようなJSONファイルになっています。
私が考えるとクラスが二つになってしまします。
jacksonは2つのクラスファイルではうまく動かないのかもしれません。
うまく動きません。

JSON

1 {"@id":"area", 2 "@name":"\u56E3\u4F53\u540D(\u5E02\u753A\u6751\u5206)", 3 "CLASS":[ 4 {"@code":"01100","@name":"\u672D\u5E4C\u5E02","@level":"3"}, 5 {"@code":"01202","@name":"\u51FD\u9928\u5E02","@level":"3"}, 6 {"@code":"01203","@name":"\u5C0F\u6A3D\u5E02","@level":"3"}, 7 {"@code":"01204","@name":"\u65ED\u5DDD\u5E02","@level":"3"}, 8 {"@code":"01205","@name":"\u5BA4\u862D\u5E02","@level":"3"}, 9 {"@code":"01206","@name":"\u91E7\u8DEF\u5E02","@level":"3"}, 10 {"@code":"01207","@name":"\u5E2F\u5E83\u5E02","@level":"3"}, 11 {"@code":"01208","@name":"\u5317\u898B\u5E02","@level":"3"}, 12 {"@code":"01209","@name":"\u5915\u5F35\u5E02","@level":"3"}, 13 {"@code":"01210","@name":"\u5CA9\u898B\u6CA2\u5E02","@level":"3"}, 14 {"@code":"01211","@name":"\u7DB2\u8D70\u5E02","@level":"3"}, 15 {"@code":"01212","@name":"\u7559\u840C\u5E02","@level":"3"}, 16 {"@code":"01213","@name":"\u82EB\u5C0F\u7267\u5E02","@level":"3"}, 17 {"@code":"01214","@name":"\u7A1A\u5185\u5E02","@level":"3"}, 18 {"@code":"01215","@name":"\u7F8E\u5504\u5E02","@level":"3"}, 19 {"@code":"01216","@name":"\u82A6\u5225\u5E02","@level":"3"}, 20 {"@code":"01217","@name":"\u6C5F\u5225\u5E02","@level":"3"}, 21 {"@code":"01218","@name":"\u8D64\u5E73\u5E02","@level":"3"}, 22 {"@code":"01219","@name":"\u7D0B\u5225\u5E02","@level":"3"}, 23 {"@code":"01220","@name":"\u58EB\u5225\u5E02","@level":"3"}, 24 {"@code":"01221","@name":"\u540D\u5BC4\u5E02","@level":"3"},

###考えたクラス
1つ目のクラス

java

1public class JavaObjectClass { 2 private String id; 3 private String name; 4 5 private List<InnerObject> CLASS = new ArrayList<>(); 6 7 public JavaObjectClass(String id, String name) { 8 this.id = id; 9 this.name = name; 10 } 11 12 //アクセッサ 13 public void setId(String id) {this.id = id;} 14 public String getId() {return id;} 15 public void setName(String name) {this.name = name;} 16 public String getName() {return name;} 17 18 //CLASSへの追加メソッド 19 public void addCLASS(InnerObject dataset) {CLASS.add(dataset);} 20 public List<InnerObject> getCLASS() {return CLASS;} 21} 22

2つ目のクラス

java

1public class InnerObject { 2 private String code; 3 private String name; 4 private String level; 5 private String parentCode; 6 7 public InnerObject (String code, String name, String level, String parentCode) { 8 this.code = code; 9 this.name = name; 10 this.level = level; 11 } 12 13 //アクセッサ 14 public String getCode() {return code;} 15 public void setCode(String code) {this.code = code;} 16 public String getName() {return name;} 17 public void setName(String name) {this.name = name;} 18 public String getLevel() {return level;} 19 public void setLevel(String level) {this.level = level;} 20 21}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Java

1new ObjectMapper().readValue(json, clazz);

でいけますよ。
jsonはレスポンスボディを渡して、clazzは変換先のオブジェクトのクラスです。

この変換先のオブジェクトの作り方が分からないということですか?
返却されるJSONを見て、"1" であればString、1であればInteger、1.1であればDouble、
true/false であればBoolean、[]であればListとかで作っていけばいいです。
JSONのキーと変数名を同じものにすれば、マッピングされます。
別の変数名にマッピングしたければ、アノテーションで指定すればできます。

http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c
http://www.nilab.info/z3/20150617_01_java_json_object_mapping_by_jackson.html

###追記
1つ目のクラス

java

1import java.util.List; 2 3import com.fasterxml.jackson.annotation.JsonProperty; 4 5public class JavaObjectClass { 6 7 @JsonProperty("@id") 8 private String id; 9 10 @JsonProperty("@name") 11 private String name; 12 13 @JsonProperty("CLASS") 14 private List<InnerObject> classList; 15 16 public JavaObjectClass() { 17 } 18 19 public JavaObjectClass(String id, String name) { 20 this.id = id; 21 this.name = name; 22 } 23 24 //アクセッサ 25 public void setId(String id) {this.id = id;} 26 public String getId() {return id;} 27 public void setName(String name) {this.name = name;} 28 public String getName() {return name;} 29 public void setClassList(List<InnerObject> classList) { this.classList = classList; } 30 public List<InnerObject> getClassList() { return classList; } 31}

2つ目のクラス

java

1import com.fasterxml.jackson.annotation.JsonIgnore; 2import com.fasterxml.jackson.annotation.JsonProperty; 3 4public class InnerObject { 5 @JsonProperty("@code") 6 private String code; 7 @JsonProperty("@name") 8 private String name; 9 @JsonProperty("@level") 10 private String level; 11 @JsonIgnore 12 private String parentCode; 13 14 public InnerObject() { 15 } 16 17 public InnerObject(String code, String name, String level, String parentCode) { 18 this.code = code; 19 this.name = name; 20 this.level = level; 21 } 22 23 //アクセッサ 24 public String getCode() {return code;} 25 public void setCode(String code) {this.code = code;} 26 public String getName() {return name;} 27 public void setName(String name) {this.name = name;} 28 public String getLevel() {return level;} 29 public void setLevel(String level) {this.level = level;} 30}

投稿2017/06/20 01:34

編集2017/06/21 00:55
root_jp

総合スコア4666

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

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

watarusugimoto

2017/06/20 17:26

ありがとうございます。 分かりづらかったので、上のようなJSONファイルを掲載しました。 jacksonは部分的にクラスが定義されれば部分的にJSONファイルをJavaオブジェクトに変換してくれるものなのでしょうか? 非常に長いJSONファイルなので、どうしたら良いか困っています。
watarusugimoto

2017/06/20 19:05

実験をしてみたのですが、変換先のオブジェクトはJSONファイルを完全にキーを割り振らないとオブジェクトに代入されないようでした。 合っていますでしょうか?
root_jp

2017/06/21 01:00 編集

追記しました。 もうちょっとちゃんと参考サイトを見た方がいいです。。 ちなみに今回は任意のオブジェクトに変換したいということで、オブジェクトを作成していますが、 new ObjectMapper().readValue(json, LinkedHashMap.class); なら、Mapにしてくれますよ。これならJavaObjectClassもInnerObjectも作る必要はありません。 保守考えるとオブジェクトの方がいいと思うので、参考までに。
watarusugimoto

2017/06/21 19:41

大変助かります。 ありがとうございます。 もう少し参考サイトを勉強したいと思います。 Mapを使ったオブジェクトの作成はぜひ挑戦したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問