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

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

ただいまの
回答率

91.78%

  • Java

    9302questions

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

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

解決済

回答 1

投稿 2017/06/20 02:57 ・編集 2017/06/21 02:25

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

watarusugimoto

score 25

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

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

試したこと

jacksonの関連のウェブサイトを見ていますが分かりません。

対象としているJSONファイル

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

                {"@id":"area",
                "@name":"\u56E3\u4F53\u540D(\u5E02\u753A\u6751\u5206)",
                "CLASS":[
                            {"@code":"01100","@name":"\u672D\u5E4C\u5E02","@level":"3"},
                            {"@code":"01202","@name":"\u51FD\u9928\u5E02","@level":"3"},
                            {"@code":"01203","@name":"\u5C0F\u6A3D\u5E02","@level":"3"},
                            {"@code":"01204","@name":"\u65ED\u5DDD\u5E02","@level":"3"},
                            {"@code":"01205","@name":"\u5BA4\u862D\u5E02","@level":"3"},
                            {"@code":"01206","@name":"\u91E7\u8DEF\u5E02","@level":"3"},
                            {"@code":"01207","@name":"\u5E2F\u5E83\u5E02","@level":"3"},
                            {"@code":"01208","@name":"\u5317\u898B\u5E02","@level":"3"},
                            {"@code":"01209","@name":"\u5915\u5F35\u5E02","@level":"3"},
                            {"@code":"01210","@name":"\u5CA9\u898B\u6CA2\u5E02","@level":"3"},
                            {"@code":"01211","@name":"\u7DB2\u8D70\u5E02","@level":"3"},
                            {"@code":"01212","@name":"\u7559\u840C\u5E02","@level":"3"},
                            {"@code":"01213","@name":"\u82EB\u5C0F\u7267\u5E02","@level":"3"},
                            {"@code":"01214","@name":"\u7A1A\u5185\u5E02","@level":"3"},
                            {"@code":"01215","@name":"\u7F8E\u5504\u5E02","@level":"3"},
                            {"@code":"01216","@name":"\u82A6\u5225\u5E02","@level":"3"},
                            {"@code":"01217","@name":"\u6C5F\u5225\u5E02","@level":"3"},
                            {"@code":"01218","@name":"\u8D64\u5E73\u5E02","@level":"3"},
                            {"@code":"01219","@name":"\u7D0B\u5225\u5E02","@level":"3"},
                            {"@code":"01220","@name":"\u58EB\u5225\u5E02","@level":"3"},
                            {"@code":"01221","@name":"\u540D\u5BC4\u5E02","@level":"3"},

考えたクラス

1つ目のクラス

public class JavaObjectClass {
    private String id;
    private String name;

    private List<InnerObject> CLASS = new ArrayList<>();

    public JavaObjectClass(String id, String name) {
        this.id = id;
        this.name = name;
    }

    //アクセッサ
    public void setId(String id) {this.id = id;}
    public String getId() {return id;}
    public void setName(String name) {this.name = name;}
    public String getName() {return name;}

  //CLASSへの追加メソッド
    public void addCLASS(InnerObject dataset) {CLASS.add(dataset);}
    public List<InnerObject> getCLASS() {return CLASS;}
}


2つ目のクラス

public class InnerObject {
    private String code;
    private String name;
    private String level;
    private String parentCode;

    public InnerObject (String code, String name, String level, String parentCode) {
        this.code = code;
        this.name = name;
        this.level = level;
    }

  //アクセッサ
    public String getCode() {return code;}
    public void setCode(String code) {this.code = code;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getLevel() {return level;}
    public void setLevel(String level) {this.level = level;}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

new 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つ目のクラス

import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

public class JavaObjectClass {

     @JsonProperty("@id")
    private String id;

     @JsonProperty("@name")
    private String name;

     @JsonProperty("CLASS")
    private List<InnerObject> classList;

    public JavaObjectClass() {
    }

    public JavaObjectClass(String id, String name) {
        this.id = id;
        this.name = name;
    }

    //アクセッサ
    public void setId(String id) {this.id = id;}
    public String getId() {return id;}
    public void setName(String name) {this.name = name;}
    public String getName() {return name;}
    public void setClassList(List<InnerObject> classList) { this.classList = classList; }
    public List<InnerObject> getClassList() { return classList; }
}


2つ目のクラス

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

public class InnerObject {
    @JsonProperty("@code")
    private String code;
    @JsonProperty("@name")
    private String name;
    @JsonProperty("@level")
    private String level;
    @JsonIgnore
    private String parentCode;

    public InnerObject() {
    }

    public InnerObject(String code, String name, String level, String parentCode) {
        this.code = code;
        this.name = name;
        this.level = level;
    }

    //アクセッサ
    public String getCode() {return code;}
    public void setCode(String code) {this.code = code;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getLevel() {return level;}
    public void setLevel(String level) {this.level = level;}
}

投稿 2017/06/20 10:34

編集 2017/06/21 09:55

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/06/21 02:26

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

    キャンセル

  • 2017/06/21 04:05

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

    キャンセル

  • 2017/06/21 10:00 編集

    追記しました。
    もうちょっとちゃんと参考サイトを見た方がいいです。。

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

    キャンセル

  • 2017/06/22 04:41

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

    キャンセル

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

ただいまの回答率

91.78%

関連した質問

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

  • Java

    9302questions

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

閲覧数の多いJavaの質問