Десериализовать 3 json объектов в один java объект с помощью Gson - PullRequest
0 голосов
/ 05 августа 2020

У меня есть json вот так:

"items": [
{
  "value": 111,
  "from": 1,
  "to": 2
},
{
  "value": 222,
  "from": 3,
  "to": 4
},
{
  "value": 333,
  "from": 5,
  "to": 6
}]

Java класс вот так:

public class Item{
String from1To2;
String from3To4;
String from5To6;
}

Я хотел бы создать один Java объект из 3 json объекты.

Я сделал что-то вроде этого: Десериализовать json:

@Override
public Item deserialize(JsonElement json, Type typeOfT,
                          JsonDeserializationContext context) throws JsonParseException {
    JsonObject jsonObject = json.getAsJsonObject();
    if (jsonObject.get("from").getAsString().equals("1")) {
        from1 = Double.parseDouble(jsonObject.get("value").getAsString());
    }
    else if (jsonObject.get("from").getAsString().equals("3")) {
        from3 = Double.parseDouble(jsonObject.get("value").getAsString());
    }
    else if (jsonObject.get("from").getAsString().equals("5")) {
        from5 = Double.parseDouble(jsonObject.get("value").getAsString());
    }
    return new Item(from1, from3, from5);
}

если я десериализую, я получу несколько Java объектов, потому что у меня есть массив json объектов.

код запуска:

Gson gson = new GsonBuilder()
            .registerTypeAdapter(Item.class, new ItemDesarializer())
            .create();

    Type itemsType = new TypeToken<ArrayList<Item>>(){}.getType();
    ArrayList<Item> items = gson.fromJson(some_string, itemsType);
    for(Item it : items) {
        System.out.println(it);
    }

КОНСОЛЬНЫЕ ЖУРНАЛЫ:

from 1 to 2: 111.0
from 3 to 4: 0.0
from 5 to 5: 0.0
from 1 to 2: 111.0
from 3 to 4: 222.0
from 5 to 6: 0.0
from 1 to 2: 111.0
from 3 to 4: 222.0
from 5 to 6: 333.0

Итак, у меня есть 3 объекта

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Вам необходимо создать свой JsonDeserializer.

JsonDeserializer<Item> deserializer = new JsonDeserializer<Item>() {  
@Override
public Item deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    JsonObject jsonObject = json.getAsJsonObject();

    int from = jsonObject.get("from").getAsInt();
    // Your logic
    return Item()
  }
};

Затем вам нужно будет добавить свой собственный десериализатор в gson

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Item.class, deserializer);
Gson customGson = gsonBuilder.create();  
Item item = customGson.fromJson(json, Item.class); 

EDIT:

Не думал, что могут быть другие проблемы, но если да, то прилагаю полное решение.

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Item.class, new JsonDeserializer<Item>() {
        @Override
        public Item deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            JsonObject jsonObject = json.getAsJsonObject();

            JsonArray arr = jsonObject.get("items").getAsJsonArray();
            Item item = new Item();
            arr.forEach(element -> {
                JsonObject obj = element.getAsJsonObject();
                switch (obj.get("from").getAsInt()){
                    case 1 : item.setFrom1To2(obj.get("value").getAsString()); break;
                    case 3 : item.setFrom3To4(obj.get("value").getAsString()); break;
                    case 5 : item.setFrom5To6(obj.get("value").getAsString()); break;
                }
            });
            return item;
        }
    });
    Gson customGson = gsonBuilder.create();
    Item item = customGson.fromJson(json, Item.class);

    System.out.println(item);

Результат:

Item{from1To2='111', from3To4='222', from5To6='333'}
0 голосов
/ 05 августа 2020

Вы можете использовать API Джексона для обработки json, который имеет множество функций для упрощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...