Как разобрать несколько полей в один подобъект в GSON? - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь проанализировать некоторые json данные, которые выглядят так:

{
  "store_name": "Coffee Co",
  "location": "New York",
  "supplier_name": "Cups Corps",
  "supplier_id": 12312521,
  "supplier_email": "cups@cups.net"
}

А вот мои Java POJOs

class Store {
    @com.google.gson.annotations.SerializedName("store_name")
    String storeName;
    String location;
    Supplier supplier;
}

class Supplier {
    String id;
    String name;
    String email;
}

//Getters and setters omitted

Проблема, с которой я столкнулся является то, что поля для Supplier сведены непосредственно в запись Store. Я попытался добавить TypeAdapter к моему Gson объекту для Supplier, но он не сработал, потому что на входящем объекте json нет поля с именем supplier. Я также не могу использовать альтернативное имя для supplier, поскольку для его создания требуется информация из всех трех полей.

Каков наилучший способ анализа этих данных, чтобы вложенные Supplier поле также может быть заполнено?

1 Ответ

2 голосов
/ 13 января 2020

Что вы можете сделать, это использовать пользовательский десериализатор:

class StoreDeserializer implements JsonDeserializer<Store> {

    @Override
    public Store deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        JsonObject jsonObject = jsonElement.getAsJsonObject();

        Supplier supplier = new Supplier(
                jsonObject.get("supplier_id").getAsInt(),
                jsonObject.get("supplier_name").getAsString(),
                jsonObject.get("supplier_email").getAsString()
        );

        return new Store(
                jsonObject.get("store_name").getAsString(),
                jsonObject.get("location").getAsString(),
                supplier
        );
    }
}

Затем вы можете десериализовать, зарегистрировав десериализатор:

String json = "{\"store_name\":\"Coffee Co\",\"location\":\"New York\",\"supplier_name\":\"Cups Corps\",\"supplier_id\":12312521,\"supplier_email\":\"cups@cups.net\"}";
Gson gson = new GsonBuilder().registerTypeAdapter(Store.class, new StoreDeserializer()).create();
Store store = gson.fromJson(json, Store.class);

Обратите внимание, что я изменил тип Supplier#id до int, так как в вашем JSON это число c:

class Supplier {
    int id;
    String name, email;

    Supplier(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}
class Store {
    String storeName, location;
    Supplier supplier;

    Store(String storeName, String location, Supplier supplier) {
        this.storeName = storeName;
        this.location = location;
        this.supplier = supplier;
    }
}
...