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

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

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

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

Java

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

3524閲覧

SpringbootのRestTemplateを利用してjsonをデシリアライズ方法

satoshi0104

総合スコア6

JSON

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

Java

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/06/06 09:58

SpringbootのRestTemplateを利用してjsonをデシリアライズを試みていますが、想定通りに変換されません。

①クライアント側プログラム

Java

1Result items = restTemplate.getForObject( 2 "https://XXX.co.jp/services/api/",Result.class);

②JSONデータ(実際にRESTAPIを実行した戻り値(大量となるため、一部を抜粋。))

JSON

1{ 2 "Items": [ 3 { 4 "Item": { 5 "author": "XXX", 6 } 7 }, 8 { 9 "Item": { 10 "author": "XXX", 11 } 12 }, 13 { 14 "Item": { 15 "author": "XXX", 16 } 17 } 18 ], 19 "hits": 30, 20} 21

実際には、author以外の項目、hits以外の項目を大量に保有していますが、省略しています。

③Resultクラス

Java

1@Getter 2@Setter 3@AllArgsConstructor 4@JsonIgnoreProperties(ignoreUnknown = false) 5public class Result { 6 7 private List<Item> items; 8 9 public Result() { 10 items = new ArrayList<>(); 11 } 12 13 @Override 14 public String toString() { 15 return String.valueOf(items.size()); 16 } 17 18} 19

④Itemクラス

Java

1@Getter 2@Setter 3@AllArgsConstructor 4@NoArgsConstructor 5@JsonIgnoreProperties(ignoreUnknown = true) 6public class Item { 7 8 private String title; 9 10 @Override 11 public String toString() { 12 return "Item{" + "title=" + title + '}'; 13 } 14 15}

上記を実行したところ、特にエラーが発生するでもないのですが、Resultクラスのitemsの要素数は0となっております。
(ResultクラスのtoStringを実行して確認しました。)
そのため、JSONからのデシリアライズに失敗しているのではないかと推測をしております。
想定通りにデシリアライズが成功しているのであれば、要素数は0以外の値となるはずです。(上記の例では3となる想定です)

RESTの戻り値は配列要素を保有しているため、デシリアライズした結果としてはリスト型として扱うことができればと思っております。

そもそもデシリアライズ先の構成が誤っている可能性もあります。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

Json を Parse するための class の階層がひとつ足りていないからではないでしょうか。

Item の下の要素が {"author": "XXX"} となっていて、
これは Json の Object なので、これを吸収する class の定義が必要になると思います

既存のItemと、新規の Author class (名称は仮)を以下のように定義すれば動作すると思われます。
author以外の項目もあるということですが、
その場合でも Json の同じ階層であれば Author class に要素を追加すれば
Parse 可能かとも思われます

@JsonIgnoreProperties(ignoreUnknown = true) @Getter private static class Item { @JsonProperty("Item") private Author author; public Item(Author author) { this.author = author; } public Item() { } public void setAuthor(Author author) { this.author = author; } } @JsonIgnoreProperties(ignoreUnknown = true) @Getter private static class Author { public void setTitle(String title) { this.title = title; } @JsonProperty("author") private String title; public Author(String title) { this.title = title; } public Author() { } }

投稿2021/06/06 21:07

kiino

総合スコア557

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問