简体   繁体   English

使用 ZA79956B0B2E7BDA297AZD5DAA572 将 3 个 json 对象反序列化为一个 java object

[英]Deserialize 3 json objects to one java object with Gson

I have json like this:我有这样的 json:

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

Java class like this: Java class 像这样:

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

I would like to create one Java object from 3 json objects.我想从 3 个 json 对象创建一个 Java object 。

I did something like this: Deserialize 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);
}

if I deserialize, I will get a few Java objects because I have a json array of objects.如果我反序列化,我会得到一些 Java 对象,因为我有一个 json 对象数组。

run code:运行代码:

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);
    }

CONSOLE LOGS:控制台日志:

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

So I have 3 objects所以我有 3 个对象

You need to create your JsonDeserializer.您需要创建您的 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()
  }
};

Then you will need to add your custom deserializer to gson然后您需要将自定义解串器添加到 gson

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

EDIT:编辑:

I didn't think there might be any further problems, but if so, I am attaching the complete solution.我认为可能不会有任何进一步的问题,但如果是这样,我将附上完整的解决方案。

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);

Output: Output:

Item{from1To2='111', from3To4='222', from5To6='333'}

You can use jackson API for handling json which is having lots of function for simplification.您可以使用 jackson API 来处理 json ,它有很多 ZC1C425268E683854D1AB5074C17A 的简化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM