com.alibaba.fastjson.*使用与异常处理

本文介绍了一个因JSON格式存储错误导致的异常案例,并详细展示了如何通过替换字符串和使用TypeReference进行泛型转换来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. json格式存储错误导致异常

数据库存储格式
"[{\"parentId\":1,\"parentCode\":\"zhongguo\",\"parentName\":\"中国\",\"sons\":[{\"sonId\":0,\"sonCode\":\"english\",\"sonName\":\"英国\"}]}]"
粘贴到eclipse后
String json = "\"[{\\\"parentId\\\":1,\\\"parentCode\\\":\\\"zhongguo\\\",\\\"parentName\\\":\\\"中国\\\",\\\"sons\\\":[{\\\"sonId\\\":0,\\\"sonCode\\\":\\\"english\\\",\\\"sonName\\\":\\\"英国\\\"}]}]\"";
转换异常
Exception in thread "main" com.alibaba.fastjson.JSONException: exepct '[', but string
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:581)
    at com.alibaba.fastjson.parser.deserializer.CollectionDeserializer.deserialze(CollectionDeserializer.java:63)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:551)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:250)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:226)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:180)
处理问题(TypeReference处理泛型转换问题)
json = json.replaceAll("\\\\\"", "\"");
json = json.substring(1, json.length()-1);
List<Parent> parseObject = JSON.parseObject(json, new TypeReference<List<Parent>>(){});
实体
@lombok.Data
@JsonInclude(Include.NON_NULL)//since 2.6  //字段值为null时不输出
public static class Parent {
    private Integer parentId;
    private String parentCode;
    private String parentName;
    private List<Son>  sons;
}
//@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) since 2.0
@JsonInclude(Include.NON_NULL)//since 2.6   
@lombok.Data
public static class Son {
    private Integer sonId;
    private String sonCode;
    private String sonName;
}
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.14</version>
</dependency>
<think>好的,我现在需要帮助用户了解如何使用com.alibaba.fast2库。不过,用户提到的“com.alibaba.fast2”可能有拼写错误,正确的应该是com.alibaba.fastjson,这是一个广泛使用的JSON处理库。首先,我需要确认用户是否指的是fastjson,然后提供相关的使用教程和示例代码。 首先,我应该检查用户的问题是否存在拼写错误。根据用户提供的引用内容,特别是引用[3],提到了fastJson异常处理,所以可以确定用户确实是想了解fastjson库的使用。因此,在回答中需要先指出这个可能的拼写错误,并确认正确的库名。 接下来,需要按照用户的要求,结构清晰地回答,包括基本用法、序列化和反序列化的示例、配置选项以及常见问题。同时,要确保所有数学公式和代码块都符合格式要求,比如行内公式用$...$,独立公式用$$...$$,代码块用三个反引号包裹并注明语言。 用户还要求生成相关问题,所以我需要准备几个fastjson使用相关的问题,例如性能优化、安全性配置、异常处理等。同时,注意引用用户提供的引用内容,特别是引用[3]中提到的autoType异常,这需要在常见问题部分进行说明,并添加引用标识。 需要确保回答使用中文,并且语言自然流畅,避免使用Markdown格式。同时,检查LaTeX语法是否正确,例如变量和公式的正确表示。虽然用户的问题可能不涉及数学公式,但如果有示例中的代码或配置参数,需要正确展示。 最后,整理回答结构,先确认库的正确名称,然后分步骤介绍使用方法和示例,接着讨论配置和常见问题,最后生成相关问题。确保每个部分都清晰,并且引用正确的位置,如引用[3]在解释autoType异常时的应用。</think>你提到的“com.alibaba.fast2”可能是对阿里巴巴的JSON处理库$fastjson$(实际包名为`com.alibaba.fastjson`)的笔误。以下是$fastjson$的基本使用教程和示例代码: --- ### 一、添加依赖(以Maven为例) ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.39</version> <!-- 以最新版本为准 --> </dependency> ``` --- ### 二、核心功能示例 #### 1. 对象序列化为JSON字符串 ```java User user = new User("张三", 25); String jsonString = JSON.toJSONString(user); System.out.println(jsonString); // 输出: {"age":25,"name":"张三"} ``` #### 2. JSON字符串反序列化为对象 ```java String json = "{\"name\":\"李四\",\"age\":30}"; User user = JSON.parseObject(json, User.class); System.out.println(user.getName()); // 输出: 李四 ``` #### 3. 复杂对象处理(嵌套/集合) ```java List<User> userList = Arrays.asList( new User("王五", 28), new User("赵六", 32) ); String listJson = JSON.toJSONString(userList); System.out.println(listJson); // 输出: [{"age":28,"name":"王五"},{"age":32,"name":"赵六"}] ``` --- ### 三、安全配置(解决autoType问题) 引用[3]中提到的`autoType`异常可通过以下方式解决: ```java // 方法1:全局开启autoType(需谨慎) ParserConfig.getGlobalInstance().setAutoTypeSupport(true); // 方法2:添加白名单 ParserConfig.getGlobalInstance().addAccept("com.example.model.User"); ``` --- ### 四、高级特性 #### 1. 自定义序列化格式 ```java public class UserSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, ...) { User user = (User) object; serializer.write(user.getName() + "(" + user.getAge() + ")"); } } // 注册自定义序列化器 SerializeConfig.getGlobalInstance().put(User.class, new UserSerializer()); ``` #### 2. 日期格式化 ```java String json = JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat); // 默认格式: yyyy-MM-dd HH:mm:ss ``` --- ### 五、注意事项 1. **序列化接口实现类**:若类实现了`Serializable`接口(如引用[2]所述),可确保跨系统传输的兼容性[^2] 2. **循环引用检测**使用`SerializerFeature.DisableCircularReferenceDetect`关闭循环引用检测 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值