JerseyとJacksonで、受け取ったJSONをデータ格納用クラスに入れようという試み

json Jackson
スポンサーリンク

REST APIで受け取ったJSONを変換して、データ格納用クラスに入れようという試みです。
調べてみたところ、Jacksonを使うといい感じにできそうです(他にいい方法もあるかも)

使うもの

  • Jersey : REST APIを作るやつ
  • Tomcat : Web Serviceを動かすやつ
  • Jackson : JSONデータを変換するやつ
  • Eclipse : 統合開発環境

ステップ1:Jerseyのプロジェクトをmavenで生成

今回はJerseyのVer 2.34を使います。プロジェクトを作ります。
もうあるよって方は読み飛ばしてください。

Jersey 2.34 User Guideの1.4. Creating a JavaEE Web Applicationからプロジェクト作成コマンドをコピペして、ターミナルにて実行します。

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
                -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
                -DgroupId=com.example -DartifactId=simple-service-webapp -Dpackage=com.example \
                -DarchetypeVersion=2.34

-DgrupId、-DartifactId、-Dpackageは必要に応じて変更しましょう。私はそのままで行きます。

私はEclipseで開発しているので、Eclipseで開きます
File > Import… > General > Projects from Folder or Archiveから、プロジェクトのDirectoryを選択してFinishをクリックすると、プロジェクトをインポートできます。

フォルダの中身はこんな感じです。

simple-service-webapp
├── pom.xml
├── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── MyResource.java
        ├── resources
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp

ステップ2: JerseyでJacksonを使えるようにする

Jacksonを使うための準備をします。やり方は、Jersey 2.34 User Guideの9.1.4. Jackson (1.x and 2.x)に書いてあるので参考にしてください。

まず、pom.xmlに必要なライブラリを追加します。<dependencies>の中に次を追加しましょう。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
</dependency>

これを追加するだけでOKっぽいです

User Guideには、JacksonをJSON (JAXB/POJO) providerに使うならJacksonFeatureとObjectMapperのContextResolver<T>の登録がいるって書いてます。

In order to use Jackson as your JSON (JAXB/POJO) provider you need to register JacksonFeature (Jackson1Feature) and a ContextResolver<T> for ObjectMapper, if needed, in your Configurable (client/server).

とりあえず、なくても動くのでOK!(実はよくわかっていない)

ステップ3: データ格納用クラスを作成

JSONのデータを変換して格納するクラスを作ります。

package com.example;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Data {

    @JsonProperty
    private int id;

    @JsonProperty
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
    
}

JSONのキーとなる変数には@JsonPropertyのアノテーションをつけます。
アノテーションをつけた変数名とJSONのキーを照らし合わせて値を取得します。
@JsonProperty(“id”)みたいにしたら、キーの名称も指定できます。

ステップ4: JSONを受け取るPOST APIを作成する

デフォルトで作成されるMyResource.javaにPOSTのAPIを追加します。

こんな感じ↓


    @POST
    @Path("/json")
    @Consumes(MediaType.APPLICATION_JSON)
    public String post(Data data) {
        
        return "id = " + data.getId() + ", name = " + data.getName();
    }

@Consumesで受け取るデータの種類を指定しています。今回はapplication/jsonですね。

Dataクラスの変数にJSONで指定した値が格納され、雑にidとnameの文字列を返します。

ステップ5: プロジェクトを起動して、POST APIにJSONを渡す

Tomcatにアプリをデプロイして、APIを実行します。

私はPostmanでチェックすることが多いのですが(それしか使ったことない)、ここではcurlの例を紹介します。

curl --location --request POST 'http://localhost:8080/simple-service-webapp/webapi/myresource/json' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": 1,
    "name": "tanaka"
}'

これをターミナルで実行して、こんな感じの文字列が表示されれば成功です。

id = 1, name = tanaka

まとめると簡単にできるじゃんって思う

以上、REST APIで受け取ったJSONを変換して、データ格納用クラスに入れる方法でした。

調べているうちは難しいって思うのですが、
まとめてしまうと簡単に見えますね。

コメント

タイトルとURLをコピーしました