Я использую ActiveAndroid для ответа на кеш от сетевых перенастроек.Как десериализовать вложенный объект JSON как String с помощью Gson, Retrofit, Active Android
Я сделал класс, который выглядит следующим образом: -
class Article extends Model {
@Column(name = "title")
@SerializedName("title")
@Expose
public String title;
@Column(name = "authors")
@SerializedName("authors")
@Expose
private String authors;
}
Соответствующий JSON-то вроде: -
{
"title":"Some title",
"authors": [{
"name": "Name",
"twitter":"@whatever"
}]
}
Здравомыслящий способом было бы использовать имеет много отношений между Author
и Article
класс, но авторы не сохраняются в базе данных, потому что у них нет @Expose
аннотации (или даже переменной) в классе Article
, и нет способа получить эту аннотацию, потому что многие вызовы будут методом звоните сюда, который возвращает List<Author>
.
// This will not work
@Expose
public List<Author> authors() {
return getMany(Author.class, "Article");
}
Так иначе я думал, что должен был хранить объект JSON в базе данных в виде строки и сериализации/десериализации для доступа.
Для этого требуется, чтобы переменная authors
была полем List<Author>
и предоставила для нее type serializer.
Проблема с этим подходом заключается в том, что я не могу знать, что тип Generic сохраняется в базе данных. Я не могу вернуть тип 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 в виде строки.
Итак, мой вопрос заключается в том, как обрабатывать некоторые из массивов JSON как строки с преобразователями GSON.
My дооснащения 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()));
Спасибо за взглянуть!
что вы имеете в виду * и нет никакой возможности иметь эту аннотацию, потому что здесь много вызовов будет вызовом метода, который возвращает Список *? –
Blackbelt
@Blackbelt обновил мой вопрос, чтобы объяснить это. – Shobhit
Я еще не совсем уверен, что вы имеете в виду. Почему статья не может содержать личный список авторов; '? –
Blackbelt