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)); // 输出为null4. 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,并在解析返回数据时增加参数以保持顺序。
