是否在GSON中反序列化字符串列表?

ldxq2e6h  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(164)

我尝试在jsonobject中保存一个字符串列表,并在加载时对其进行反序列化。当我保存列表时,我创建了一个JsonObject,并使用GSON.toJson将其添加为一个属性。我创建了一个String arraylist序列化程序来序列化该项,当我检查mongo数据库时,它似乎保存为jsonArray,但当我尝试对其进行反序列化时,它告诉我它不是JsonArray。
下面是我的代码:
订单对象:

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Getter
@Setter
@RequiredArgsConstructor
public class Order {

    private final UUID id;
    private final String table;

    private short numberOfPeople;
    private LocalDate timeOfOrder = LocalDate.now();

    private String staffInCharge = "";

    private List<String> order = new ArrayList<>();
    private String note = "";
}

@RequiredArgumentsConstructor只是为我创建了一个构造函数,因此我不必执行public Order()等操作
序列化和反序列化类的导入:

import com.google.gson.*;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.oscar.orderbird.OrderBird;
import me.oscar.orderbird.gson.GsonUtil;
import me.oscar.orderbird.mongo.MongoUtils;
import me.oscar.orderbird.profile.food.Food;
import me.oscar.orderbird.profile.order.Order;
import me.oscar.orderbird.profile.staff.Staff;
import me.oscar.orderbird.profile.table.Table;
import org.bson.Document;

import java.util.*;

序列化:

if (!this.orders.isEmpty()){
            JsonArray orderArray = new JsonArray();
            this.orders.values().forEach(order -> {
                JsonObject ordersObect = new JsonObject();
                ordersObect.addProperty("id", order.getId().toString());
                ordersObect.addProperty("name", order.getTable());
                ordersObect.addProperty("note", order.getNote());
                ordersObect.addProperty("numberOfPeople", order.getNumberOfPeople());
                ordersObect.addProperty("staffInCharge", order.getStaffInCharge());
                ordersObect.addProperty("orderItems", GsonUtil.GSON.toJson(order.getOrder()));
                orderArray.add(ordersObect);
            });
            document.put("orders", orderArray.toString());

        }

还原序列化:

if (document.containsKey("orders")) {
            if (document.get("orders") instanceof String) {
                JsonArray ordersArray = PARSER.parse(document.getString("orders")).getAsJsonArray();

                for (JsonElement jsonElement : ordersArray) {
                    JsonObject jsonObject = jsonElement.getAsJsonObject();
                    try {
                        Order order = new Order(UUID.fromString(jsonObject.get("id").getAsString()), jsonObject.get("name").getAsString());
                        order.setNote(jsonObject.get("note").getAsString());
                        order.setNumberOfPeople(jsonObject.get("numberOfPeople").getAsShort());
                        order.setStaffInCharge(jsonObject.get("staffInCharge").getAsString());
                        order.setOrder(GsonUtil.GSON.fromJson(jsonObject.get("orderItems").getAsJsonObject(), ArrayList.class));
                        this.orders.put(jsonObject.get("name").getAsString(), order);

                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }

数组列表适配器:

package me.oscar.orderbird.gson.impl;

import com.google.gson.*;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class StringArrayAdapter implements JsonDeserializer<List<String>>, JsonSerializer<List<String>> {
    @Override
    public List<String> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        JsonArray jsonArray = jsonElement.getAsJsonArray();
        List<String> values = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++){
            values.set(i, jsonArray.get(i).getAsJsonPrimitive().getAsString());
        }
        return values;
    }

    @Override
    public JsonElement serialize(List<String> stringList, Type type, JsonSerializationContext jsonSerializationContext) {
        JsonArray jsonArray = new JsonArray();
        for (String string : stringList) {
            jsonArray.add(new JsonPrimitive(string));
        }
        return jsonArray;
    }
}

当我尝试设置顺序时,出现错误:

java.lang.IllegalStateException: Not a JSON Object: "[\n  \"Steak\"\n]"
ulydmbyx

ulydmbyx1#

您的实施存在两个问题
1.从“对象”更改为“文档”时,需要保留orderItems的属性类类型
变更

ordersObect.addProperty("orderItems", GsonUtil.GSON.toJson(order.getOrder()));

结束

ordersObect.addProperty("orderItems", GSON.toJson(order.getOrder(), ArrayList.class));

1.从Document阅读时,需要以相同的类别类型读取
变更

GsonUtil.GSON.fromJson(jsonObject.get("orderItems").getAsJsonObject(), ArrayList.class)

结束

GSON.fromJson(jsonObject.get("orderItems").getAsString(),ArrayList.class)

因此工作代码如下:

import com.Order;
import com.StringArrayAdapter;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.bson.Document;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

JsonParser PARSER = new JsonParser();
Gson GSON = new GsonBuilder()
        .registerTypeHierarchyAdapter(ArrayList.class, new StringArrayAdapter())
        .setPrettyPrinting()
        .serializeNulls()
        .create();
Document document = new Document();
Map<String, Order> orders = new HashMap<>();

for (int i = 0; i < 2; i++) {
    Order order = new Order(UUID.randomUUID(), "" + i);
    orders.put(order.getTable(), order);
}

// SO Post Code
if (!orders.isEmpty()) {
    JsonArray orderArray = new JsonArray();
    orders.values().forEach(order -> {
        JsonObject ordersObect = new JsonObject();
        ordersObect.addProperty("id", order.getId().toString());
        ordersObect.addProperty("name", order.getTable());
        ordersObect.addProperty("note", order.getNote());
        ordersObect.addProperty("numberOfPeople", order.getNumberOfPeople());
        ordersObect.addProperty("staffInCharge", order.getStaffInCharge());
        ordersObect.addProperty("orderItems", GSON.toJson(order.getOrder(), ArrayList.class));
        orderArray.add(ordersObect);
    });
    document.put("orders", orderArray.toString());
}

System.out.println("document: " + document);
Map<String, Order> readOrders = new HashMap<>();
if (document.containsKey("orders")) {
    if (document.get("orders") instanceof String) {
        JsonArray ordersArray = PARSER.parse(document.getString("orders")).getAsJsonArray();

        for (JsonElement jsonElement : ordersArray) {
            JsonObject jsonObject = jsonElement.getAsJsonObject();
            try {
                Order order = new Order(UUID.fromString(jsonObject.get("id").getAsString()), jsonObject.get("name").getAsString());
                order.setNote(jsonObject.get("note").getAsString());
                order.setNumberOfPeople(jsonObject.get("numberOfPeople").getAsShort());
                order.setStaffInCharge(jsonObject.get("staffInCharge").getAsString());
                order.setOrder((ArrayList<String>)GSON.fromJson(jsonObject.get("orderItems").getAsString(), ArrayList.class));
                readOrders.put(jsonObject.get("name").getAsString(), order);

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}
System.out.println("Orders read : " + readOrders);

输出:

document: Document{{orders=[{"id":"e853617a-b516-4daf-ba6c-e5d731c556de","name":"0","note":"","numberOfPeople":0,"staffInCharge":"","orderItems":"[]"},{"id":"31004bbd-164d-4e64-b468-7021e1c21c39","name":"1","note":"","numberOfPeople":0,"staffInCharge":"","orderItems":"[]"}]}}
Orders read : {0=Order(id=e853617a-b516-4daf-ba6c-e5d731c556de, table=0, numberOfPeople=0, timeOfOrder=2021-06-16, staffInCharge=, order=[], note=), 1=Order(id=31004bbd-164d-4e64-b468-7021e1c21c39, table=1, numberOfPeople=0, timeOfOrder=2021-06-16, staffInCharge=, order=[], note=)}

相关问题