将Object/Object[]条目序列化为gson JsonObject

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

我正在从后端阅读一个资源,它给了我一个条目的Map。我正在迭代这些条目并检索值。该值的类型是object或object[],实际类型是普通原语或一个Calender类。
我的目标是创建一个json响应,它应该看起来像这样:

  1. {
  2. "testUri": "https://www.google.de",
  3. "testDate": 1636986289929,
  4. "testLong": "123123",
  5. "testName": "name",
  6. "testPath": "path",
  7. "indexName": "AAA_de_de_offers",
  8. "testArrayDate": [1636986289929],
  9. "testArrayLong": [111, 222, 333],
  10. "testArrayUri": ["http://www.google.de", "http://www.test.de"],
  11. "testArrayDouble": [1.2, 2.1, 3.1],
  12. "testBoolean": "true",
  13. "testArrayBoolean": [true, true, false],
  14. "regex": "ASDASD",
  15. "suggestHeadline": "Beliebte Suchbegriffe",
  16. "testDecimal": "12",
  17. "testArrayDecimal": [1, 2, 3],
  18. "testDouble": "12.87",
  19. "testString": "testString"
  20. }

但是我对结果真的很不满意,因为我重复了很多做同样事情的检查和方法,唯一不同的是类型。
我做的第一步是检查我面对的是哪个类

  1. Object value = e.getValue();
  2. final boolean valIsDate = value instanceof Calendar;
  3. final boolean valIsDateArray = Calendar[].class.equals(value.getClass());
  4. final boolean valIsDouble = Double.class.equals(value.getClass());
  5. final boolean valIsDoubleArray = Double[].class.equals(value.getClass());
  6. final boolean valIsLong = Long.class.equals(value.getClass());
  7. final boolean valIsLongArray = Long[].class.equals(value.getClass());
  8. final boolean valIsBoolean = Boolean.class.equals(value.getClass());
  9. final boolean valIsBooleanArray = Boolean[].class.equals(value.getClass());
  10. final boolean valIsBigDecimal = BigDecimal.class.equals(value.getClass());
  11. final boolean valIsBigDecimalArray = BigDecimal[].class.equals(value.getClass());
  12. final boolean valIsString = value instanceof String;
  13. final boolean valIsStringArray = String[].class.equals(value.getClass());

之后,我将在一个大型if子句的帮助下创建json条目

  1. JsonObject json = new JsonObject();
  2. if (valIsStringArray) {
  3. json.add(key, getJsonArray((String[]) value));
  4. } else if (valIsDate) {
  5. json.addProperty(key, ((Calendar) value).getTimeInMillis());
  6. } else if (valIsDateArray) {
  7. json.add(key, getJsonArray((Calendar[]) value));
  8. } else if (valIsDouble) {
  9. json.addProperty(key, (Double) value);
  10. } else if (valIsDoubleArray) {
  11. json.add(key, getJsonArray((Double[]) value));
  12. } else if (valIsLong) {
  13. json.addProperty(key, (Long) value);
  14. } else if (valIsLongArray) {
  15. json.add(key, getJsonArray((Long[]) value));
  16. } else if (valIsBoolean) {
  17. json.addProperty(key, (Boolean) value);
  18. } else if (valIsBooleanArray) {
  19. json.add(key, getJsonArray((Boolean[]) value));
  20. } else if (valIsBigDecimal) {
  21. json.addProperty(key, gson.toJson(value, BigDecimal.class));
  22. } else if (valIsBigDecimalArray) {
  23. json.add(key, getJsonArray((BigDecimal[]) value));
  24. } else {
  25. // String is the default fallback
  26. json.addProperty(key, valueAsString);
  27. }

getJsonArray正在接收数组类型并创建JsonArray条目,例如

  1. protected JsonArray getJsonArray(final Calendar[] arrayAsObject) {
  2. final JsonArray jsonArray = new JsonArray();
  3. for (final Calendar e : arrayAsObject) {
  4. jsonArray.add(e.getTimeInMillis());
  5. }
  6. return jsonArray;
  7. }

我相信有一个更好的方法来实现这一点:)

beq87vna

beq87vna1#

您可以使用自动识别对象类别的toJsonTree方法。

  1. json.add(key, new Gson().toJsonTree(value));

相关问题