2017-02-07 10 views
-1

Как разобрать это на дооснащение (GSON)?GSON - разбор конкретных JSON

["football",["football","football skills","football vines","football fails","football manager 2017","football challenge","football respect","football manager 2017 download","football factory","football daily"]] 

Это массив с одной строкой и другой массив. Нет объектов, просто массивов. Как представить это в модели?

Это сервер: http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=Query

Я пытался использовать JSON для POJO, но она ничего не возвращает.

+0

Вы тоже управляете сервером? потому что, на мой взгляд, этот json как-то «ошибается». Вы можете попробовать что-то вроде: '{type:" football ", list: [" football "," fb skills ", .....]}' – MoQ93

+0

Возможный дубликат [Использование GSON в Android для анализа сложного объекта JSON] (http://stackoverflow.com/questions/4556230/using-gson-in-android-to-parse-a-complex-json-object) –

+0

Я не ... JSON действительно, но для gson .. .hm Это сервер: http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=Query – vanste25

ответ

0

@MoQ прав, json ошибается в том, что это не объект. Вам нужно обернуть его внутри, например {«list»: [«футбол», [«футбол», «футбол», «футбольные лозы», «футбол не удается», «футбольный менеджер 2017», «футбол», «футбол уважение», «футбольный менеджер 2017 скачать», «футбольная фабрика», «футбол в день»]]}

Это называется JavaScript Объект Обозначение.

+0

Я согласен с вами, но сервер возвращает это, поэтому я как-то пытаюсь это решить. Сервер: http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=Query – vanste25

+0

Хорошо, в этом случае вы должны перефразировать вопрос. Вы не получаете json, но хотите, чтобы парсер был достаточно мягким, чтобы десериализовать его в объект. – Micha

+0

Но каждый проверщик json говорит, что это действительно json. Что это, если не json? – vanste25

0

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 (если я не ошибаюсь).