com.alibaba.fastjson.JSON对类对象的序列化与反序列化

本文介绍如何使用Fastjson库将Java对象序列化为JSON字符串,并演示了如何反序列化JSON字符串回Java对象。同时,通过实例展示了TypeReference在处理复杂类型转换中的应用。

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

1. 目标

把类的对象存储到字符串可存储

2. 类定义

public interface JsonInterface {
}
mport com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class JsonVo implements JsonInterface {
    private String id;
    private String name;

    public JsonVo(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("id:%s   ||||  name:%s", id, name);

    }
}

3. 测试

    public void test() {
        JsonInterface tmp = new JsonVo("id1", "name1");
        String json = JSON.toJSONString(tmp);

        System.out.println(json);
        JsonInterface jsonVo = JSON.parseObject(json, JsonVo.class);
        System.out.println(jsonVo);

        System.out.println("--------");

        byte[] bytes = JSON.toJSONBytes(tmp);
        System.out.println(bytes);
        JsonInterface jsonVo2 = JSON.parseObject(bytes, JsonVo.class);
        System.out.println(jsonVo2);
    }

结果

{"id":"id1","name":"name1"}
id:id1   ||||  name:name1
--------
[B@383534aa
id:id1   ||||  name:name1

4. Fastjson

Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景

5. TypeReference

例1

 public void test2() {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(9);
        list.add(4);
        list.add(8);
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("a", list);
        System.out.println(jsonObj);

        List<String> list2 = jsonObj.getObject("a", new TypeReference<List<Integer>>(){});
        System.out.println(list2);
    }

结果

{"a":[1,9,4,8]}
[1, 9, 4, 8]

例2

public void test3() {
        List<JsonVo> list = new ArrayList<>();
        list.add(new JsonVo("id1", "name1"));
        list.add(new JsonVo("id2", "name2"));
        list.add(new JsonVo("id3", "name3"));
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("a", list);
        System.out.println(jsonObj);

        List<String> list2 = jsonObj.getObject("a", new TypeReference<List<JsonVo>>(){});
        System.out.println(list2);
    }

结果

{"a":[{"id":"id1","name":"name1"},{"id":"id2","name":"name2"},{"id":"id3","name":"name3"}]}
[id:id1   ||||  name:name1, id:id2   ||||  name:name2, id:id3   ||||  name:name3]

  

### 使用 `@JSONField` 注解定制序列化反序列化行为 #### 1. 更改字段名称 通过 `@JSONField(name = "custom_name")`,可以指定 JSON 数据中某个字段的名称Java 属性名称不同。这在实际开发中非常常见,尤其是在对接外部接口时需要遵循特定命名规则的情况。 ```java import com.alibaba.fastjson.annotation.JSONField; public class User { private int id; @JSONField(name = "user_name") private String name; private int age; // 构造函数、getter 和 setter 方法省略 } ``` 上述代码会将 `name` 字段映射为 JSON 中的 `"user_name"` 键[^3]。 --- #### 2. 控制字段忽略 如果希望某些字段不参序列化反序列化操作,可以通过 `serialize = false` 或 `deserialize = false` 来实现。 ```java public class User { private int id; @JSONField(serialize = false) private String password; private int age; // 构造函数、getter 和 setter 方法省略 } ``` 在此例子中,`password` 字段不会被序列化JSON 结果中。 --- #### 3. 设置时间格式 对于日期型的字段,默认情况下可能无法满足业务需求的时间格式。此时可通过 `format` 参数来指定所需的日期格式。 ```java import java.util.Date; public class Event { private String title; @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date eventDate; // 构造函数、getter 和 setter 方法省略 } ``` 此配置会使 `eventDate` 被序列化为指定的字符串格式。 --- #### 4. 处理多名称兼容性 当存在多个可能的键名时,可使用 `alternateNames` 参数支持旧版或备用名称解析。 ```java public class Order { @JSONField(name = "order_id", alternateNames = {"orderId"}) private String orderId; // 构造函数、getter 和 setter 方法省略 } ``` 这样,在反序列化过程中既接受 `"order_id"` 又能识别 `"orderId"` 的输入[^5]。 --- #### 5. 延迟加载优化 为了提高性能并减少不必要的计算开销,可以利用 `ordinal = true` 实现延迟加载功能。 ```java public class Product { private String productId; @JSONField(ordinal = 10) private double price; // 构造函数、getter 和 setter 方法省略 } ``` 这里的 `price` 将按照其优先级顺序进行处理。 --- #### 总结 以上展示了如何借助 `@JSONField` 注解完成多种场景下的自定义序列化反序列化逻辑调整。无论是重命名字段还是管理复杂的数据结构变换,该工具都提供了极大的灵活性和支持能力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值