Intereting Posts
Проблема обнаружения столкновений на основе пикселов с OpenGLES 2.0 под Android Как изменить маркер для наложения на кран для Android? Где хранятся чертежи или клипарт из файла android.R.drawable? Android Webview – полностью очистить кэш Управление навигационной панелью и обратной кнопкой панели инструментов из фрагмента в андроиде Ошибка: для Android SDK требуется Android Developer Toolkit версии 22.6.1 или выше Как обновить плагин com.android.application? Android: минимальный запас диалогов Как получить исходное имя файла ресурса по id? Не удалось найти пакет com.google.android.gsf. Как переопределить фильтр в ArrayAdapter от android? Когда необходимо использовать singleTop launchMode в виджетах или приложениях Android? Внедрить двойной клик для кнопки на Android Почему получение Google Directions для Android с использованием данных KML больше не работает? "Android.provider.Telephony.SMS_RECEIVED" не работает на моем устройстве (HTC Wildfire) – как отлаживать?

Развернуть динамический ключ 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(); 

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