[解決済み] GsonでList<T>オブジェクトをデシリアライズする?
質問
Google Gsonでリストオブジェクトを転送したいのですが、generic型のデシリアライズの方法がわかりません。
を見て試したのは これ (BalusCさんの回答)。
MyClass mc = new Gson().fromJson(result, new List<MyClass>() {}.getClass());
というエラーが表示されます。
List<MyClass>() {}
は継承された抽象メソッドを実装しなければならない..." そしてクイックフィックスを使用すると、20以上のメソッドスタブのモンスターが表示されます。
もっと簡単な解決策があると思うのですが、なかなか見つかりません
今、私はこれを持っています。
Type listType = new TypeToken<List<MyClass>>() {}.getType();
MyClass mc = new Gson().fromJson(result, listType);
しかし、以下のような例外が発生します。
fromJson
という行があります。
java.lang.NullPointerException
at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)
I
する
キャッチ
JsonParseExceptions
そして
result
がnullでない場合。
確認したところ
listType
をデバッガで表示させたところ、以下のようになりました。
-
list Type
-
args = ListOfTypes
-
list = null
-
resolvedTypes = Type[ 1 ]
-
-
loader = PathClassLoader
-
ownerType0 = null
-
ownerTypeRes = null
-
rawType = Class (java.util.ArrayList)
-
rawTypeName = "java.util.ArrayList"
-
ということで、どうやら
getClass
の起動がうまくいきませんでした。何かいい方法はないでしょうか...?
を確認しました。 Gsonユーザーガイド . それは、Jsonへのジェネリックタイプのパース中に起こるはずの実行時例外に言及しています。私は例と同じように"間違った"(上に示されていない)を行いましたが、その例外はまったく発生しませんでした。そこで、ユーザーガイドで提案されているようにシリアライズを変更しました。しかし、それは役に立ちませんでした。
編集する
解決済みです。以下の私の回答を参照してください。
どのように解決するのですか?
ジェネリックコレクションをデシリアライズするためのメソッドです。
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
...
Type listType = new TypeToken<ArrayList<YourClass>>(){}.getType();
List<YourClass> yourClassList = new Gson().fromJson(jsonArray, listType);
コメントで何人かの方が言及されているので、ここで、その説明として
TypeToken
クラスが使用されています。構成は
new TypeToken<...>() {}.getType()
はコンパイル時の型を捕捉します。
<
と
>
) をランタイム
java.lang.reflect.Type
オブジェクトを作成します。とは異なり
Class
オブジェクトは、生の(消去された)型しか表すことができませんが
Type
オブジェクトは、汎用型のパラメータ化されたインスタンスなど、Java言語の任意の型を表現することができます。
は
TypeToken
クラス自体にはパブリックコンストラクタがありません。その代わり、常に無名のサブクラスを作成します (そのため
{}
この式では必要な部分です)。
型消去の関係で
TypeToken
クラスは、コンパイル時に完全に分かっている型しか捕捉することができません。(つまり
new TypeToken<List<T>>() {}.getType()
型パラメータ
T
.)
関連
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
Spring Boot による HTTPS アクセスの設定
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] jQueryでフォームデータをJavaScriptオブジェクトに変換する
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] JSON文字列を安全にオブジェクトに変換する
-
[解決済み] JSオブジェクトをJSON文字列に変換する
-
[解決済み] JSONをC#のダイナミックオブジェクトにデシリアライズする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
jd-gui Java Exceptionが発生しました。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
自動配線された依存性のインジェクションに失敗しました。
-
HttpClientがGZIP形式でない場合の対処法
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
ローカルリソースのロードが許可されていない場合の解決策