[英]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.