将 Object/Object[] 个条目序列化为 gson JsonObject
Serialize Object/Object[] entries to gson JsonObject
我正在从后端读取资源,该资源为我提供了一个条目映射。我正在迭代这些并检索值。该值的类型是 object 或 object[],实际类型是普通基元或 Calender class.
我的目标是创建一个 json 响应,它应该如下所示:
{
"testUri": "https://www.google.de",
"testDate": 1636986289929,
"testLong": "123123",
"testName": "name",
"testPath": "path",
"indexName": "AAA_de_de_offers",
"testArrayDate": [1636986289929],
"testArrayLong": [111, 222, 333],
"testArrayUri": ["http://www.google.de", "http://www.test.de"],
"testArrayDouble": [1.2, 2.1, 3.1],
"testBoolean": "true",
"testArrayBoolean": [true, true, false],
"regex": "ASDASD",
"suggestHeadline": "Beliebte Suchbegriffe",
"testDecimal": "12",
"testArrayDecimal": [1, 2, 3],
"testDouble": "12.87",
"testString": "testString"
}
但我对结果真的很不满意,因为我重复了很多检查和方法都是一样的,唯一不同的是类型。
我要做的第一步是检查class我面对的是哪个
Object value = e.getValue();
final boolean valIsDate = value instanceof Calendar;
final boolean valIsDateArray = Calendar[].class.equals(value.getClass());
final boolean valIsDouble = Double.class.equals(value.getClass());
final boolean valIsDoubleArray = Double[].class.equals(value.getClass());
final boolean valIsLong = Long.class.equals(value.getClass());
final boolean valIsLongArray = Long[].class.equals(value.getClass());
final boolean valIsBoolean = Boolean.class.equals(value.getClass());
final boolean valIsBooleanArray = Boolean[].class.equals(value.getClass());
final boolean valIsBigDecimal = BigDecimal.class.equals(value.getClass());
final boolean valIsBigDecimalArray = BigDecimal[].class.equals(value.getClass());
final boolean valIsString = value instanceof String;
final boolean valIsStringArray = String[].class.equals(value.getClass());
之后,我在大 if 子句
的帮助下创建 json 条目
JsonObject json = new JsonObject();
if (valIsStringArray) {
json.add(key, getJsonArray((String[]) value));
} else if (valIsDate) {
json.addProperty(key, ((Calendar) value).getTimeInMillis());
} else if (valIsDateArray) {
json.add(key, getJsonArray((Calendar[]) value));
} else if (valIsDouble) {
json.addProperty(key, (Double) value);
} else if (valIsDoubleArray) {
json.add(key, getJsonArray((Double[]) value));
} else if (valIsLong) {
json.addProperty(key, (Long) value);
} else if (valIsLongArray) {
json.add(key, getJsonArray((Long[]) value));
} else if (valIsBoolean) {
json.addProperty(key, (Boolean) value);
} else if (valIsBooleanArray) {
json.add(key, getJsonArray((Boolean[]) value));
} else if (valIsBigDecimal) {
json.addProperty(key, gson.toJson(value, BigDecimal.class));
} else if (valIsBigDecimalArray) {
json.add(key, getJsonArray((BigDecimal[]) value));
} else {
// String is the default fallback
json.addProperty(key, valueAsString);
}
getJsonArray 正在接收数组类型并创建 JsonArray 条目
例如
protected JsonArray getJsonArray(final Calendar[] arrayAsObject) {
final JsonArray jsonArray = new JsonArray();
for (final Calendar e : arrayAsObject) {
jsonArray.add(e.getTimeInMillis());
}
return jsonArray;
}
我确定有更好的方法来实现这一点:)
您可以使用 toJsonTree
自动识别对象 class 的方法。
json.add(key, new Gson().toJsonTree(value));
我正在从后端读取资源,该资源为我提供了一个条目映射。我正在迭代这些并检索值。该值的类型是 object 或 object[],实际类型是普通基元或 Calender class.
我的目标是创建一个 json 响应,它应该如下所示:
{
"testUri": "https://www.google.de",
"testDate": 1636986289929,
"testLong": "123123",
"testName": "name",
"testPath": "path",
"indexName": "AAA_de_de_offers",
"testArrayDate": [1636986289929],
"testArrayLong": [111, 222, 333],
"testArrayUri": ["http://www.google.de", "http://www.test.de"],
"testArrayDouble": [1.2, 2.1, 3.1],
"testBoolean": "true",
"testArrayBoolean": [true, true, false],
"regex": "ASDASD",
"suggestHeadline": "Beliebte Suchbegriffe",
"testDecimal": "12",
"testArrayDecimal": [1, 2, 3],
"testDouble": "12.87",
"testString": "testString"
}
但我对结果真的很不满意,因为我重复了很多检查和方法都是一样的,唯一不同的是类型。
我要做的第一步是检查class我面对的是哪个
Object value = e.getValue();
final boolean valIsDate = value instanceof Calendar;
final boolean valIsDateArray = Calendar[].class.equals(value.getClass());
final boolean valIsDouble = Double.class.equals(value.getClass());
final boolean valIsDoubleArray = Double[].class.equals(value.getClass());
final boolean valIsLong = Long.class.equals(value.getClass());
final boolean valIsLongArray = Long[].class.equals(value.getClass());
final boolean valIsBoolean = Boolean.class.equals(value.getClass());
final boolean valIsBooleanArray = Boolean[].class.equals(value.getClass());
final boolean valIsBigDecimal = BigDecimal.class.equals(value.getClass());
final boolean valIsBigDecimalArray = BigDecimal[].class.equals(value.getClass());
final boolean valIsString = value instanceof String;
final boolean valIsStringArray = String[].class.equals(value.getClass());
之后,我在大 if 子句
的帮助下创建 json 条目JsonObject json = new JsonObject();
if (valIsStringArray) {
json.add(key, getJsonArray((String[]) value));
} else if (valIsDate) {
json.addProperty(key, ((Calendar) value).getTimeInMillis());
} else if (valIsDateArray) {
json.add(key, getJsonArray((Calendar[]) value));
} else if (valIsDouble) {
json.addProperty(key, (Double) value);
} else if (valIsDoubleArray) {
json.add(key, getJsonArray((Double[]) value));
} else if (valIsLong) {
json.addProperty(key, (Long) value);
} else if (valIsLongArray) {
json.add(key, getJsonArray((Long[]) value));
} else if (valIsBoolean) {
json.addProperty(key, (Boolean) value);
} else if (valIsBooleanArray) {
json.add(key, getJsonArray((Boolean[]) value));
} else if (valIsBigDecimal) {
json.addProperty(key, gson.toJson(value, BigDecimal.class));
} else if (valIsBigDecimalArray) {
json.add(key, getJsonArray((BigDecimal[]) value));
} else {
// String is the default fallback
json.addProperty(key, valueAsString);
}
getJsonArray 正在接收数组类型并创建 JsonArray 条目 例如
protected JsonArray getJsonArray(final Calendar[] arrayAsObject) {
final JsonArray jsonArray = new JsonArray();
for (final Calendar e : arrayAsObject) {
jsonArray.add(e.getTimeInMillis());
}
return jsonArray;
}
我确定有更好的方法来实现这一点:)
您可以使用 toJsonTree
自动识别对象 class 的方法。
json.add(key, new Gson().toJsonTree(value));