Intereting Posts
Использование планировщика заданий в Android API <21 Roboblender-3.0.1.jar: не включен в Android: javax.tools. Ссылка из com.google.inject.blender.AnnotationDatabaseGenerator Что такое LOCAL_MODULE_TAGS? Как использовать предварительно скомпилированные файлы заголовков в Android NDK Значения «доверия» Android SpeechRecognizer запутывают Com.google.firebase.database.DatabaseException: Сериализация массивов не поддерживается, используйте вместо них списки Простая макет теней в Android Как я могу сделать кнопку более отзывчивой? Разработчик Android / iOS против Marmalade SDK Добавить больше пространства между элементами в Android Spinner без специального стиля? Что произойдет с SharedPreferences при обновлении приложения Android? Android NFC Intents не запускают мою деятельность Приложение продолжает забывать sharedpreferences при перезапуске Android ProgressBar: как установить вторичный цвет программно Как вы записываете видео с анимированным оверлеем в Android?

Развернуть динамический ключ Json String с помощью Retrofit

Я пытаюсь проанализировать следующий динамический ключ Json String.

"report":{ "data":{ "results":{ "558952cca6d73d7d81c2eb9d":{ "Max":-1, "Min":-1, "Slope":-1, }, "558ce148a6d73d7d81c2fa8a":{ "Max":-2, "Min":-1, "Slope":-2, } } } } 

После того, как я пытаюсь получить данные, но получаю ошибку во время разбора последней динамической строки json.

  public class Report { @SerializedName("data") @Expose private Data data; public Data getData() { return data; } public void setData(Data data) { this.data = data; } @Override public String toString() { return "Report{" + "data=" + data + '}'; } } public class Data { @SerializedName("results") @Expose private ResultInside result; public ResultInside getResult() { return result; } public void setResult(ResultInside result) { this.result = result; } } public class ResultInside { /*@SerializedName("results") @Expose*/ private Map<String, Vitals> elemDetails = new HashMap<>(); public Map<String, Vitals> getElemDetails() { return elemDetails; } public void setElemDetails(Map<String, Vitals> elemDetails) { this.elemDetails = elemDetails; } } 

Любое предложение, как разобрать в этом случае!

Solutions Collecting From Web of "Развернуть динамический ключ Json String с помощью Retrofit"

Ваш resultInside класс добавляет дополнительный слой объекта, который не существует в вашем JSON. Попробуйте переместить карту в поле results Data class.

 public class Data { @SerializedName("results") @Expose private Map<String, Vitals> result; //.... } 

Лучшим способом сделать это будет:

 ---------------------- public class Report { @SerializedName("data") @Expose private Data data; ---------------------- public class Data { public HashMap<String, DataValues> dataValues; public Data() { this.dataVaues = new HashMap<>(); } } ----------------------------- 

Затем создайте класс Parser следующим образом:

 public class DataParser implements JsonDeserializer<Data> { @Override public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { Data result = new Data(); try { final HashMap<String, DataValues> map = readServiceUrlMap(json.getAsJsonObject()); if(map != null) { result.dataValues = map; } }catch (JsonSyntaxException ex){ return null; } return result; } private HashMap<String, DataValues> readServiceUrlMap(final JsonObject jsonObject) throws JsonSyntaxException { if(jsonObject == null) { return null; } Gson gson = new Gson(); HashMap<String, DataValues> products = new HashMap<>(); for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) { String key = entry.getKey(); DataValues value = gson.fromJson(entry.getValue(), DataValues.class); products.put(key, value); } return products; } ---------------------------------------------- 

После этого введите это в свой класс ApiClient

 public class ApiClient { private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl) { if(retrofit == null) { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Data.class, new DataParser()); retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(gsonBuilder.create())) .build(); 

Надеюсь, это поможет кому-то