Gson JsonArray to List long类型变为科学计数法

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

当我尝试将JsonArray转换为List时,我得到一个long类型转换错误,代码如下

public static <T> ArrayList toArrayList(JsonArray jsonArray) {
    System.out.println("---=Receive====>>"+jsonArray);
    GsonBuilder gsonBuilder = new GsonBuilder();
    Gson gson = gsonBuilder.setLongSerializationPolicy(LongSerializationPolicy.STRING).create();
    return gson.fromJson(jsonArray.toString(),
                         new TypeToken<List<T>>() {}.getType());
}

实验结果:

--=Receive====>>[{"serialNo":"1339497989051277312","createBy":"xxxx","createDate":1608196182000,"updateBy":"xxxx","updateDate":1615444156000}]
-=result--->>[{serialNo=1339497989051277312, createBy=xxxx, createDate=1.608196182E12, updateBy=xxxx, updateDate=1.615444156E12}]

我做错了什么?

vecaoik1

vecaoik11#

您的程式码有多个问题:

  • 结果列表类型是原始的,因此在编译时不是类型安全的。
  • 如果可能,首选接口List,而不是类ArrayList
  • T的类型参数没有绑定到它返回的列表,因此没有什么意义(如果有)。
  • 从类型参数创建类型标记的方法不起作用:在运行时,它仍然被Map到java.lang.Object,Gson试图选择它认为最好的一个。
  • 类型标记不应该(而且不能)在这样的方法中创建,而是从调用点传递。而且,它们是不可变的,因此也是线程安全的。
  • 您不需要在每次调用此方法时都创建Gson示例。
  • 在这种情况下,将JSON树转换为字符串是非常无用的,因为Gson可以遍历JSON树并读取JSON令牌流,而不需要花费双倍的时间进行解析。

当我要求你提供list元素类时,我试图暗示你的实际代码是这样的:

ArrayList arrayList = toArrayList(jsonArray);
System.out.println(arrayList);

无法工作。请注意以下事项:

  • 这段代码(可能也是您的代码)根本没有提到元素类型。
  • 如果您检查 * 真实的 * list元素类,您会看到它被反序列化为com.google.gson.internal.LinkedTreeMap--从Gson的Angular 来看,这是一种泛型类型,我在上面谈到过(arrayList.get(0).getClass())。
  • JSON并不区分“long”、“integer”、“short”、“u64”、“i8”以及其他类似的类型。JSON数值类型只是一个 number。Gson选择java.lang.Double,因为这种类型可以满足大多数实际需求(BigDecimal是一个更好的选择,但它也会消耗内存;这也是忽略setLongSerializationPolicy提示的原因)。

Gson已经尽了最大的努力,它做到了。
你要做的,总结一下,就是:
第一个
传递类型标记为Gson提供了 * 足够 * 的信息来处理类型。原因如下:

[MyObject(serialNo=1339497989051277312, createBy=xxxx, createDate=1608196182000, updateBy=xxxx, updateDate=1615444156000)]
MyObject

相关问题