fromjson报错详解
在使用JSON解析库(如Gson和fastjson)时,开发者经常遇到各种解析错误,本文将详细探讨fromjson报错的常见原因及解决方法,并通过表格形式归纳相关内容,以便读者更好地理解和解决问题。
一、常见fromjson报错类型及解决方案
1. Gson报错:Java.lang.NumberFormatException: Invalid long
原因:当JSON字符串中的数值与目标类型不匹配时,会抛出此异常,JSON中的数值为字符串"null",但目标类型是long。
解决方案:
方法一:在反序列化之前检查并处理无效数据。
方法二:使用自定义的JsonDeserializer来处理特定字段的解析逻辑。
示例代码:
public class LongDefault0Adapter implements JsonDeserializer<Long> { @Override public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.getAsString().equals("null")) { return 0L; } try { return json.getAsLong(); } catch (NumberFormatException e) { return 0L; } } } Gson gson = new GsonBuilder() .registerTypeAdapter(Long.class, new LongDefault0Adapter()) .create();
2. fastjson报错:数据顺序改变
原因:在某些情况下,fastjson可能会改变JSON数据的顺序,导致解密或验签失败。
解决方案:确保fastjson版本为1.2.x,并在解析返回数据时增加参数以保持顺序。
示例代码:
// 确保fastjson版本为1.2.x JSON.parseObject(result, Map.class, new JSONReaderFeature[]{JSONReaderFeature.SupportArrayToBean});
3. Gson报错:无法序列化匿名内部类
原因:Gson无法序列化匿名内部类,因为匿名内部类没有名字。
解决方案:使用命名内部类或Lambda表达式替代匿名内部类,或者换用其他支持序列化匿名内部类的JSON库,如fastjson。
示例代码:
Map<String, String> map = new HashMap<String, String>() {{ put("logNo", "123456"); put("reqTime", "20210607"); }}; Gson gson = new Gson(); System.out.println(gson.toJson(map)); // 输出为null
4. Gson报错:com.google.gson.JsonSyntaxException: java.text.DecimalFormatSymbols
原因:当JSON字符串中包含特殊字符时,可能会导致解析错误。
解决方案:确保JSON字符串格式正确,并使用适当的转义字符。
示例代码:
String jsonStr = "{\"name\": \"萧晓\", \"age\": 18}"; User user = gson.fromJson(jsonStr, User.class);
问题描述 | 可能原因 | 解决方案 |
Java.lang.NumberFormatException: Invalid long | JSON中的数值与目标类型不匹配 | 使用自定义JsonDeserializer处理特定字段 |
数据顺序改变 | fastjson改变了JSON数据的顺序 | 确保fastjson版本为1.2.x,并增加保持顺序的参数 |
无法序列化匿名内部类 | 匿名内部类没有名字 | 使用命名内部类或换用支持序列化匿名内部类的JSON库 |
com.google.gson.JsonSyntaxException: java.text.DecimalFormatSymbols | JSON字符串中包含特殊字符 | 确保JSON字符串格式正确,并使用适当的转义字符 |
三、FAQs
Q1: 如何解决Gson中的Java.lang.NumberFormatException: Invalid long错误?<br>
A1: 可以通过实现自定义的JsonDeserializer来处理特定字段的解析逻辑,确保在反序列化之前检查并处理无效数据。
Q2: fastjson如何保持JSON数据的顺序不变?<br>
A2: 确保fastjson版本为1.2.x,并在解析返回数据时增加参数以保持顺序。