原始数组的自定义 Gson 反序列化
Custom Gson deserialization for primitive arrays
给定以下 Json 片段:
String json = "{ \"test\" : [1, 2.5, 4, 5.66] }";
以及对 GSON 的调用:
Map obj = gson.fromJson(array, Map.class);
我得到一个正确解析的 Java 对象,它是一个包含双精度数组列表的 LinkedHashMap。出于我的程序的目的,我希望结果包含数组和数字的原始版本。因此,我最好得到一个包含 double[]
而不是 ArrayList<Double>
的地图。
我已经通过 JsonDeserializer<?>
接口研究了自定义反序列化,但没有成功实现 ArrayLists
成为 []
的并且 Doubles
变为 doubles
。
我必须理解什么才能告诉 GSON 在解析任意值时选择 Array 而不是 ArrayList 和 double 而不是 Double JSON?
您可以使用 new TypeToken<LinkedHashMap <String, double[]>>(){}.getType()
而不是 Map.class
这是演示:
public static void main(String[] args) throws IOException, JSONException {
String array = "{ \"test\" : [1, 2.5, 4, 5.66] }";
Gson gson = new Gson();
LinkedHashMap <String, double[]> obj
= gson.fromJson(array, new TypeToken<LinkedHashMap<String, double[]>>(){}.getType());
for (Map.Entry<String, double[]> entry : obj.entrySet()) {
System.out.println("Key = " + entry.getKey() +
", Value = " + Arrays.toString(entry.getValue()));
}
}
给定以下 Json 片段:
String json = "{ \"test\" : [1, 2.5, 4, 5.66] }";
以及对 GSON 的调用:
Map obj = gson.fromJson(array, Map.class);
我得到一个正确解析的 Java 对象,它是一个包含双精度数组列表的 LinkedHashMap。出于我的程序的目的,我希望结果包含数组和数字的原始版本。因此,我最好得到一个包含 double[]
而不是 ArrayList<Double>
的地图。
我已经通过 JsonDeserializer<?>
接口研究了自定义反序列化,但没有成功实现 ArrayLists
成为 []
的并且 Doubles
变为 doubles
。
我必须理解什么才能告诉 GSON 在解析任意值时选择 Array 而不是 ArrayList 和 double 而不是 Double JSON?
您可以使用 new TypeToken<LinkedHashMap <String, double[]>>(){}.getType()
而不是 Map.class
这是演示:
public static void main(String[] args) throws IOException, JSONException {
String array = "{ \"test\" : [1, 2.5, 4, 5.66] }";
Gson gson = new Gson();
LinkedHashMap <String, double[]> obj
= gson.fromJson(array, new TypeToken<LinkedHashMap<String, double[]>>(){}.getType());
for (Map.Entry<String, double[]> entry : obj.entrySet()) {
System.out.println("Key = " + entry.getKey() +
", Value = " + Arrays.toString(entry.getValue()));
}
}