HCRM博客

为什么在使用fromjson时会遇到报错问题?

fromjson报错详解

在使用JSON解析库(如Gson和fastjson)时,开发者经常遇到各种解析错误,本文将详细探讨fromjson报错的常见原因及解决方法,并通过表格形式归纳相关内容,以便读者更好地理解和解决问题。

为什么在使用fromjson时会遇到报错问题?-图1
(图片来源网络,侵权删除)

一、常见fromjson报错类型及解决方案

1. Gson报错:Java.lang.NumberFormatException: Invalid long

原因:当JSON字符串中的数值与目标类型不匹配时,会抛出此异常,JSON中的数值为字符串"null",但目标类型是long。

解决方案

方法一:在反序列化之前检查并处理无效数据。

方法二:使用自定义的JsonDeserializer来处理特定字段的解析逻辑。

为什么在使用fromjson时会遇到报错问题?-图2
(图片来源网络,侵权删除)

示例代码:

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报错:无法序列化匿名内部类

为什么在使用fromjson时会遇到报错问题?-图3
(图片来源网络,侵权删除)

原因: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,并在解析返回数据时增加参数以保持顺序。

分享:
扫描分享到社交APP
上一篇
下一篇