web-dev-qa-db-ja.com

ネストされたJSONオブジェクトをSpringRestTemplateを使用してJavaクラスにマップする

私はこれが簡単かもしれないことを知っています。しかし、私はそれを機能させることができません。

そのため、SpringRestTemplateを使用してJSONデータをマッピングしようとしています。 RESTコールから次のJSON応答があります。

{
  "message":"ok",
  "status":"ok",
  "data":[
      {"Name":"Yo",
       "Address":"100 Test Rd"},
      {...},
      {...}
   ]
}

そして、これが私がマップしようとしているクラスです。

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {

  private String message;
  private String status;
  private List<Data> data;

  // I could also use a array instead
  // private Data[] data;
}

これが私のデータクラスです:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data implements Serializable {

  private String Name;
  private String Address;
}

RestTemplateを呼び出すために使用したコードは次のとおりです。

public Reponse getResponse() {
    ResponseEntity<Reponse> responseEntity = restTemplate.getForEntity(Url, Reponse.class);

    return responseEntity.getBody();
}

ここで問題が発生します。 「メッセージ」と「ステータス」を取得できましたが、データを記録/印刷しようとするとnullが表示されます。ここで何が起こっているのか正確にはわかりません。私は本当にいくつかの助けを使うことができました。ありがとう。

9
Ren

ネストされたJSONオブジェクトをクラスモデルにマッピングしないRestTemplateでも同様の問題が発生していました。多くの不満を感じた後、RestTemplateを使用してJSONを(ターゲットオブジェクトに直接変換するのではなく)文字列として取得し、GoogleGsonライブラリを使用することにしました。文字列をターゲットエンティティに変換します。

pom.xml

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

restTemplateを呼び出すコード:

 ResponseEntity<String> responseEntity = restTemplate.getForEntity(Url,String.class);
Gson gson = new GsonBuilder().create();
Response reponse = gson.fromJson(responseEntity , Response.class);

残念ながら、ネストされたオブジェクトが最初にRestTemplateを使用してマップされなかった理由を見つけることができませんでしたが、この回避策が役立つことを願っています!

4
O. Coburn

私は同じ問題に遭遇しました。 @JsonPropertyで注釈を付けます:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data implements Serializable {

    @JsonProperty("Name")
    private String name;

    @JsonProperty("Address")
    private String address;

    // getters / setters for name and address

}

これで、Dataクラスのフィールドにデータが入力され、JSON表現とは関係なくフィールドに名前を付けることができます(たとえば、nameの代わりにName)。

1
James

RestTemplateを使用してREST APIからJsonデータを読み取るときに同様の問題が発生しました。リストの宣言ゲッターとセッターを解決するには:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {

  private String message;
  private String status;
  private List<Data> data;

 // getters and Setters for the list. 


}

RestTemplateは、listarrayの値を対応する配列に内部的にマップします。

1
Abhishek

以下のように、プロパティ「data」に@JsonUnwrappedでアノテーションを付けます

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {
    private String message;
    private String status;
    @JsonUnwrapped
    private List<Data> data;
}
1
Isank

私はこれが古いスレッドであることを知っています。

しかし、同じ問題を抱えている人は、ジャクソンでこの目的のためにMappingJackson2HttpMessageConverterを使用できます。

this スレッドで与えられた答えを参照してください。

0

private List<Data> data = new AllarList<Data>( )を使用してください。そして、両方のクラスでgetters()メソッドとsetters()メソッドを提供してください。

データクラスの上に@JsonInclude(Include.NON_EMPTY)を置きます

メインのPOM.xmlファイルのセクションの下に以下の依存関係を追加して、Mavenコンパイルを実行してください。その後、私はあなたの問題が解決されると思います。

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.8.8</version>
        </dependency>
0
sayan