Разбор итерационных json-объектов с использованием retrofit / gson - PullRequest
0 голосов
/ 21 февраля 2019

Мне посылают что-то вроде следующего с сервера, к которому я должен подключиться:

{
  "properties": {
    "prop1": {
      "type": "string",
      "title": "string"
    },
    "prop2": {
      "type": "string",
      "title": "string"
    },
    "prop3": {
      "type": "string",
      "title": "string"
    },
    "prop4": {
      "type": "string",
      "title": "string"
    }
  }
}

Очевидно, что для сервера было бы более идеально отправлять массив объектов с идентификаторомполе, но я не могу изменить это, к сожалению.Числа после «prop» могут расти до бесконечности (хотя реально не превысят 50 или около того), есть ли изящный способ справиться с этим в Retrofit 2 / GSON?или мне нужно перехватить этот вызов и делать это каждый раз вручную?

В идеальном мире я хотел бы получить массив "Poj" Prop, которые имеют поле id (1, 2,3 и т. Д.) Или даже с «prop1», «prop2» и т. Д. В поле каждого объекта.

1 Ответ

0 голосов
/ 21 февраля 2019

Вот подсказка для вашего вопроса:

Вам необходимо создать класс модели, например:

public class PropertiesData {
    public ArrayList<Properties> properties = new ArrayList<>();

    //getters setters


    public ArrayList<Properties> getProperties() {
        return properties;
    }

    public void setProperties(ArrayList<Properties> properties) {
        this.properties = properties;
    }

    public class Properties {
        Map<String, SubProperties> subPropertiesMap = new HashMap<>();

        //getters setters

        public Map<String, SubProperties> getSubPropertiesMap() {
            return subPropertiesMap;
        }

        public void setSubPropertiesMap(Map<String, SubProperties> subPropertiesMap) {
            this.subPropertiesMap = subPropertiesMap;
        }
    }

    public class SubProperties {
        public String type;
        public String title;
        //getters setters

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }
    }
}

Вам необходимо создать пользовательский Gson Builder :

    Gson gson_gd = new GsonBuilder().registerTypeAdapter(
            PropertiesData.class, new JsonDeserializer<PropertiesData>() {
                @Override
                public PropertiesData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                    JsonObject elements= json.getAsJsonObject();
                    return new Gson().fromJson(elements,
                            PropertiesData.class);
                }
            }
    ).create();

И используйте его при создании модифицированного экземпляра:

.setConverter(GsonConverterFactory.create(gson_gd)).build();

Все, что я создал, основано на предоставленном json.

Надеюсь, это поможет вам.

...