看案例网站,做平面设计需要学什么软件,高端品牌服装,视频直播需要哪些设备Gson#xff08;又称Google Gson#xff09;是Google公司发布的一个开放源代码的Java库#xff0c;主要用途为序列化Java对象为JSON字符串#xff0c;或反序列化JSON字符串成Java对象。
依赖
Gradle:
dependencies {implementation com.google.code.gson:gson:2.11.0
}…Gson又称Google Gson是Google公司发布的一个开放源代码的Java库主要用途为序列化Java对象为JSON字符串或反序列化JSON字符串成Java对象。
依赖
Gradle:
dependencies {implementation com.google.code.gson:gson:2.11.0
}Maven:
dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.11.0/version
/dependency我们有的项目中是使用gson解析网络请求返回数据。JSON转Java对象使用fromJson(String json, Class classOfT)方法将JSON字符串转换为指定的Java对象类型。 代码 public static void main(String[] args) {Gson gson new Gson();String json {\id\:246989989011,\algItemCode\:\北京\,\city\:\北京\,\platform\:\web\};
// Type type new TypeTokenResponseReportTwoDto() {
// }.getType();Map jsonString gson.fromJson(json, Map.class);// 输出JSON字符串System.out.println(Serialized JSON: jsonString);}
}以上代码会出现 类似{id2.46989989011E11, algItemCode北京, city北京, platformweb} ID为科学计数法的数据。
Gson为什么使用科学计数法
因为JSON规范中规定数字必须以十进制格式表示。然而当一个数字非常大或非常小时直接使用普通的十进制表示可能会导致精度丢失或者无法表示。为了解决这个问题JSON规范允许使用科学计数法来表示这些数字。
在Java中当一个整数超过Integer.MAX_VALUE2^31-1时它会自动转换为Long类型。同样当一个浮点数超过Float.MAX_VALUE大约为1.7E308时它会自动转换为Double类型。因此当我们使用Gson将Java对象序列化为JSON字符串时如果遇到非常大的数字Gson会将其转换为科学计数法表示的字符串。
问题解决
转换时指定转换类不要为map.
public static void main(String[] args) {Gson gson new Gson();String json {\id\:246989989011,\algItemCode\:\北京\,\city\:\北京\,\platform\:\web\};ReportTwoDto jsonString gson.fromJson(json, ReportTwoDto.class);// 输出JSON字符串System.out.println(Serialized JSON: jsonString);}输出ReportTwoDto(id246989989011, algItemCode北京)
TypeToken是一种用于在Java中解决泛型类型擦除问题的工具它通过反射机制获取泛型参数的具体类型从而支持在运行时进行泛型类型的操作。 TypeToken通过匿名内部类的使用来保留泛型信息。具体来说当创建一个TypeToken实例时会生成一个匿名内部类这个匿名类包含了泛型参数的实际类型信息。
public static void main(String[] args) {Gson gson new Gson();String json {\data\:{\id\:246989989011,\algItemCode\:\北京\,\city\:\北京\,\platform\:\web\}};Type type new TypeTokenResponseReportTwoDto() {}.getType();ResponseReportTwoDto jsonString gson.fromJson(json, type);// 输出JSON字符串System.out.println(Serialized JSON: jsonString.data);}也能输出 Serialized JSON: ReportTwoDto(id246989989011, algItemCode北京) Gson的TypeToken是一种强大的工具通过在运行时保留泛型信息解决了Java泛型类型擦除的问题。它在处理复杂JSON结构和泛型类型时非常有用广泛应用于各种需要序列化和反序列化的场景中。 2. 使用工具类转换
public static void main(String[] args) {Gson gson new Gson();String json {\id\:246989989011,\algItemCode\:\北京\,\city\:\北京\,\platform\:\web\};Map jsonString gson.fromJson(json, Map.class);ReportTwoDto bean BeanUtil.toBean(jsonString, ReportTwoDto.class);// 输出JSON字符串System.out.println(Serialized JSON: bean);}其他工具替代
如果项目中对数字格式有严格要求且不能接受科学计数法的表示方式也可以考虑使用其他序列化工具如FastJson等这些工具可能提供了更多的控制选项来满足特定的需求。Gson使用科学计数法主要是出于优化存储空间和提高解析效率的考虑但在某些情况下这可能会导致不符合预期的结果。因此了解如何调整Gson的行为或选择其他工具来满足特定需求是非常重要的。