Gson отлично подходит и действительно позволяет применять пользовательские стратегии десериализации или внедрять адаптеры в структуры JSON, которые не очень удобны для пользователя. Предположим, что вы хорошо иметь следующий пользовательское сопоставление для поиска результатов запроса:
final class Suggestions {
final String query;
final List<String> suggestions;
Suggestions(final String query, final List<String> suggestions) {
this.query = query;
this.suggestions = suggestions;
}
}
Написание пользовательских JsonDeserializer
(считают, что это просто JSON в объект/значение трансформаторные Java), где вы определяете, как разобрать данную JSON полезной нагрузки и преобразовать его в экземпляре класса Suggestions
:
final class SuggestionsJsonDeserializer
implements JsonDeserializer<Suggestions> {
private static final JsonDeserializer<Suggestions> suggestionsJsonDeserializer = new SuggestionsJsonDeserializer();
private static final Type listOfStringsType = new TypeToken<List<String>>() {
}.getType();
private SuggestionsJsonDeserializer() {
}
static JsonDeserializer<Suggestions> getSuggestionsJsonDeserializer() {
return suggestionsJsonDeserializer;
}
@Override
public Suggestions deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext context)
throws JsonParseException {
if (!jsonElement.isJsonArray()) {
throw new JsonParseException("The given JSON is not an array");
}
final JsonArray jsonArray = jsonElement.getAsJsonArray();
final int length = jsonArray.size();
if (length != 2) {
throw new JsonParseException("The given JSON array length is " + length);
}
final JsonElement e0 = jsonArray.get(0);
final JsonElement e1 = jsonArray.get(1);
final String query;
final List<String> suggestions;
if (e0.isJsonPrimitive() && e1.isJsonArray()) {
// If the JSON array is [query, suggestions]
query = e0.getAsJsonPrimitive().getAsString();
suggestions = context.deserialize(e1.getAsJsonArray(), listOfStringsType);
// e1.getAsJsonArray() call is unnecessary because the context would throw an exception if it would be not an array
// But just make it explicit and "more symmetric" to the object destructuring around
// Another way might be not delegating the string list parsing to context, but building a string list out of the JSON array of strings manually
} else if (e0.isJsonArray() && e1.isJsonPrimitive()) {
// If the JSON array elements are swapped like [suggestions, query]
query = e1.getAsJsonPrimitive().getAsString();
suggestions = context.deserialize(e0.getAsJsonArray(), listOfStringsType);
} else {
throw new JsonParseException("Unexpected JSON array structure");
}
return new Suggestions(query, suggestions);
}
}
следующий шаг делает Gson, чтобы быть в курсе вашего отображения и его JSON десериализатор пары:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(Suggestions.class, getSuggestionsJsonDeserializer())
.create();
Тестирование это без Модернизированный
final Suggestions suggestions = gson.fromJson(JSON, Suggestions.class);
out.println(suggestions.query);
out.println(suggestions.suggestions);
выведет:
футбол
[футбол, футбольные навыки, футбольные лоз, футбол терпит неудачу, футбольный менеджер 2017, футбол вызов, футбол уважение, футбольный менеджер 2017 загрузка, футбольная фабрика, футбол каждый день]
Чтобы сделать Дооснащение осведомленным о ваших пользовательских Gson
ins tance, вам просто нужно зарегистрировать его в Retrofit.Builder
с .addConverterFactory(GsonConverterFactory.create(gson))
для дооснащения 2, или .setConverter(new GsonConverter(gson))
для модернизации 1 (если я не ошибаюсь).
Вы тоже управляете сервером? потому что, на мой взгляд, этот json как-то «ошибается». Вы можете попробовать что-то вроде: '{type:" football ", list: [" football "," fb skills ", .....]}' – MoQ93
Возможный дубликат [Использование GSON в Android для анализа сложного объекта JSON] (http://stackoverflow.com/questions/4556230/using-gson-in-android-to-parse-a-complex-json-object) –
Я не ... JSON действительно, но для gson .. .hm Это сервер: http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=Query – vanste25