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

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

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

  1. import lombok.Getter;
  2. import lombok.RequiredArgsConstructor;
  3. import lombok.Setter;
  4. import java.time.LocalDate;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.UUID;
  8. @Getter
  9. @Setter
  10. @RequiredArgsConstructor
  11. public class Order {
  12. private final UUID id;
  13. private final String table;
  14. private short numberOfPeople;
  15. private LocalDate timeOfOrder = LocalDate.now();
  16. private String staffInCharge = "";
  17. private List<String> order = new ArrayList<>();
  18. private String note = "";
  19. }

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

  1. import com.google.gson.*;
  2. import lombok.Getter;
  3. import lombok.RequiredArgsConstructor;
  4. import me.oscar.orderbird.OrderBird;
  5. import me.oscar.orderbird.gson.GsonUtil;
  6. import me.oscar.orderbird.mongo.MongoUtils;
  7. import me.oscar.orderbird.profile.food.Food;
  8. import me.oscar.orderbird.profile.order.Order;
  9. import me.oscar.orderbird.profile.staff.Staff;
  10. import me.oscar.orderbird.profile.table.Table;
  11. import org.bson.Document;
  12. import java.util.*;

序列化:

  1. if (!this.orders.isEmpty()){
  2. JsonArray orderArray = new JsonArray();
  3. this.orders.values().forEach(order -> {
  4. JsonObject ordersObect = new JsonObject();
  5. ordersObect.addProperty("id", order.getId().toString());
  6. ordersObect.addProperty("name", order.getTable());
  7. ordersObect.addProperty("note", order.getNote());
  8. ordersObect.addProperty("numberOfPeople", order.getNumberOfPeople());
  9. ordersObect.addProperty("staffInCharge", order.getStaffInCharge());
  10. ordersObect.addProperty("orderItems", GsonUtil.GSON.toJson(order.getOrder()));
  11. orderArray.add(ordersObect);
  12. });
  13. document.put("orders", orderArray.toString());
  14. }

还原序列化:

  1. if (document.containsKey("orders")) {
  2. if (document.get("orders") instanceof String) {
  3. JsonArray ordersArray = PARSER.parse(document.getString("orders")).getAsJsonArray();
  4. for (JsonElement jsonElement : ordersArray) {
  5. JsonObject jsonObject = jsonElement.getAsJsonObject();
  6. try {
  7. Order order = new Order(UUID.fromString(jsonObject.get("id").getAsString()), jsonObject.get("name").getAsString());
  8. order.setNote(jsonObject.get("note").getAsString());
  9. order.setNumberOfPeople(jsonObject.get("numberOfPeople").getAsShort());
  10. order.setStaffInCharge(jsonObject.get("staffInCharge").getAsString());
  11. order.setOrder(GsonUtil.GSON.fromJson(jsonObject.get("orderItems").getAsJsonObject(), ArrayList.class));
  12. this.orders.put(jsonObject.get("name").getAsString(), order);
  13. } catch (Exception ex) {
  14. ex.printStackTrace();
  15. }
  16. }
  17. }
  18. }

数组列表适配器:

  1. package me.oscar.orderbird.gson.impl;
  2. import com.google.gson.*;
  3. import java.lang.reflect.Type;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class StringArrayAdapter implements JsonDeserializer<List<String>>, JsonSerializer<List<String>> {
  7. @Override
  8. public List<String> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
  9. JsonArray jsonArray = jsonElement.getAsJsonArray();
  10. List<String> values = new ArrayList<>();
  11. for (int i = 0; i < jsonArray.size(); i++){
  12. values.set(i, jsonArray.get(i).getAsJsonPrimitive().getAsString());
  13. }
  14. return values;
  15. }
  16. @Override
  17. public JsonElement serialize(List<String> stringList, Type type, JsonSerializationContext jsonSerializationContext) {
  18. JsonArray jsonArray = new JsonArray();
  19. for (String string : stringList) {
  20. jsonArray.add(new JsonPrimitive(string));
  21. }
  22. return jsonArray;
  23. }
  24. }

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

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

ulydmbyx1#

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

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

结束

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

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

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

结束

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

因此工作代码如下:

  1. import com.Order;
  2. import com.StringArrayAdapter;
  3. import com.google.gson.Gson;
  4. import com.google.gson.GsonBuilder;
  5. import com.google.gson.JsonArray;
  6. import com.google.gson.JsonElement;
  7. import com.google.gson.JsonObject;
  8. import com.google.gson.JsonParser;
  9. import org.bson.Document;
  10. import java.util.ArrayList;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import java.util.UUID;
  14. JsonParser PARSER = new JsonParser();
  15. Gson GSON = new GsonBuilder()
  16. .registerTypeHierarchyAdapter(ArrayList.class, new StringArrayAdapter())
  17. .setPrettyPrinting()
  18. .serializeNulls()
  19. .create();
  20. Document document = new Document();
  21. Map<String, Order> orders = new HashMap<>();
  22. for (int i = 0; i < 2; i++) {
  23. Order order = new Order(UUID.randomUUID(), "" + i);
  24. orders.put(order.getTable(), order);
  25. }
  26. // SO Post Code
  27. if (!orders.isEmpty()) {
  28. JsonArray orderArray = new JsonArray();
  29. orders.values().forEach(order -> {
  30. JsonObject ordersObect = new JsonObject();
  31. ordersObect.addProperty("id", order.getId().toString());
  32. ordersObect.addProperty("name", order.getTable());
  33. ordersObect.addProperty("note", order.getNote());
  34. ordersObect.addProperty("numberOfPeople", order.getNumberOfPeople());
  35. ordersObect.addProperty("staffInCharge", order.getStaffInCharge());
  36. ordersObect.addProperty("orderItems", GSON.toJson(order.getOrder(), ArrayList.class));
  37. orderArray.add(ordersObect);
  38. });
  39. document.put("orders", orderArray.toString());
  40. }
  41. System.out.println("document: " + document);
  42. Map<String, Order> readOrders = new HashMap<>();
  43. if (document.containsKey("orders")) {
  44. if (document.get("orders") instanceof String) {
  45. JsonArray ordersArray = PARSER.parse(document.getString("orders")).getAsJsonArray();
  46. for (JsonElement jsonElement : ordersArray) {
  47. JsonObject jsonObject = jsonElement.getAsJsonObject();
  48. try {
  49. Order order = new Order(UUID.fromString(jsonObject.get("id").getAsString()), jsonObject.get("name").getAsString());
  50. order.setNote(jsonObject.get("note").getAsString());
  51. order.setNumberOfPeople(jsonObject.get("numberOfPeople").getAsShort());
  52. order.setStaffInCharge(jsonObject.get("staffInCharge").getAsString());
  53. order.setOrder((ArrayList<String>)GSON.fromJson(jsonObject.get("orderItems").getAsString(), ArrayList.class));
  54. readOrders.put(jsonObject.get("name").getAsString(), order);
  55. } catch (Exception ex) {
  56. ex.printStackTrace();
  57. }
  58. }
  59. }
  60. }
  61. System.out.println("Orders read : " + readOrders);

输出:

  1. 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":"[]"}]}}
  2. 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=)}
展开查看全部

相关问题