Retrofitネットワークコールの応答をActiveAndroidでキャッシュします。Gson、Retrofit、Active AndroidでネストされたJSONオブジェクトをStringとしてデシリアライズする方法
私は次のようになり、クラス作っ: -
class Article extends Model {
@Column(name = "title")
@SerializedName("title")
@Expose
public String title;
@Column(name = "authors")
@SerializedName("authors")
@Expose
private String authors;
}
対応するJSONのようなものである: - 正気の方法はAuthor
とArticle
の間にあり、多くの関係を用いることであろう
{
"title":"Some title",
"authors": [{
"name": "Name",
"twitter":"@whatever"
}]
}
をしかし、著者は@Expose
アノテーション(または変数)をArticle
クラスに持たないため、データベースに保存されていません。多くの呼び出しがメソッドになるため、そのアノテーションを持つ方法はありませんここではList<Author>
を返します。
// This will not work
@Expose
public List<Author> authors() {
return getMany(Author.class, "Article");
}
私は、JSONオブジェクトをデータベースに格納して文字列として格納し、アクセスをシリアル化/デシリアライズすることを考えました。
これは、authors
変数をList<Author>
クラスにして、type serializerを提供する必要があります。
このアプローチの問題は、データベースに保存されている汎用タイプを知る方法がないことです。私はList<Author>
型を返すことはできません。作家のように、JSON全体にいくつかのJSON配列があるからです。
私が考えた最終的な解決策は、文字列として格納し、文字列として扱い、アクセスのためにデシリアライズするメソッドを作ることです。
private List<Author> _authors;
public List<Author> authors() {
if (_authors == null) {
Gson gson = ServiceGenerator.gsonBuilder.create();
Type type = new TypeToken<List<Author>>(){}.getType();
_authors = gson.fromJson(authors, type);
}
return _authors;
}
しかし、私はこれを行うにしようとすると、GSONがエラーをスローします - - :このような
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY
私の質問は、いくつかのJSON配列をGSONコンバータの文字列として扱う方法です。私が使用しています
私のレトロフィットBuilderは次のとおりです。 - 外観を取るための
public static final GsonBuilder gsonBuilder = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.excludeFieldsWithoutExposeAnnotation();
private static final Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()));
ありがとう!
あなたが何を意味するか、次のようにJsonObjectにLinkedTreeMapを変換してみLinkedTreeMap
としてそれをデシリアライズします*このアノテーションを持つ方法はありません。なぜなら、多くの呼び出しがメソッド呼び出しであるからです。リスト *? –
Blackbelt
@Blackbeltが私の質問を更新して説明しました。 – Shobhit
私はまだあなたがどういう意味を持っているのか分かりません。なぜ記事が '私的リスト著者;を保持できないのですか? –
Blackbelt