fastjson2 简单使用

参考

https://alibaba.github.io/fastjson2/
https://alibaba.github.io/fastjson2/annotations_cn.html
https://alibaba.github.io/fastjson2/features_cn

基本操作

json 字符串转为 jsonObject:

String json = "{\"name\":\"tom\",\"age\":18}";
JSONObject data = JSON.parseObject(json);

json 字符串转为 jsonArray:

String json = "[{\"name\":\"Alice\",\"age\":25,\"city\":\"Exampleville\"},{\"name\":\"Bob\",\"age\":30," +
        "\"city\":\"Sampleburg\"},{\"name\":\"Charlie\",\"age\":28,\"city\":\"Testington\"}]";
final JSONArray jsonArray = JSON.parseArray(json);

json 字符串转为 java 对象:

String json = "{\"name\":\"tom\",\"age\":18}";
User user = JSON.parseObject(json, User.class);

java 对象转为 json 字符串:

final User user = new User();
user.setName("tom");
user.setAge(18);
final String jsonString = JSON.toJSONString(user);

操作 json:

String json = "{\"name\":\"JohnDoe\",\"age\":30,\"city\":\"NewYork\",\"isStudent\":false,\"grades\":[85,90," +
        "78,92],\"address\":{\"street\":\"123MainSt\",\"zipCode\":\"10001\"},\"contact\":{\"email\":\"john" +
        ".doe@example.com\",\"phoneNumbers\":[\"555-1234\",\"555-5678\"]},\"balance\":1200.75}";
final JSONObject jsonObject = JSON.parseObject(json);
final String name = jsonObject.getString("name");
final Integer age = jsonObject.getInteger("age");
final JSONArray grades = jsonObject.getJSONArray("grades");
final JSONObject address = jsonObject.getJSONObject("address");
final String street = address.getString("street");
final Double balance = jsonObject.getDouble("balance");

fastjson2 中提供了 json 中对象和数组的对应表示,对象使用 JSONObject 表示,列表使用 JSONArray 表示,JSONObject、JSONArray 也都提供了相应的操作方法来实现获取值、添加值、更新值、删除值等操作(方法都很通俗易懂,get 开头就是获取值,set 开头的方法就是更新值,方法名和 remove 类似的就是删除操作,非常简单)。

高级操作

枚举类序列化时指定序列化使用的字段

第一种实现方法比较复杂,是使用自定义序列化器实现:

@Getter
public enum Season {
    SPRING("春天", "万物复苏"),
    SUMMER("夏天", "热"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬季", "冷");

    private final String description;

    private final String features;

    Season(String description, String features) {
        this.description = description;
        this.features = features;
    }

}
@Data
public class Student {
    public String name;
    public Integer age;
    public Season favoriteSeason;
}
// enum 默认序列化成 json
final Student student = new Student();
student.setAge(18);
student.setName("tom");
student.setFavoriteSeason(Season.SUMMER);
System.out.println(JSON.toJSONString(student));

// 使用序列化器指定枚举类序列化时使用的字段
final ObjectWriter<Season> seasonWriter = (jsonWriter, fieldValue, fieldName, type, l) -> {
    if (fieldValue instanceof Season) {
        jsonWriter.writeString(((Season) fieldValue).getDescription());
    } else {
        jsonWriter.writeAny(fieldValue);
    }
};

final ObjectWriterProvider objectWriterProvider = new ObjectWriterProvider();
objectWriterProvider.register(Season.class, seasonWriter);
final JSONWriter.Context writeContext = JSONFactory.createWriteContext(objectWriterProvider);
final String jsonString = JSON.toJSONString(student, writeContext);
System.out.println(jsonString);

image.png
从结果中可以看到,enum 默认序列化时使用的是枚举常量,我们使用自定义序列化器指定序列化 Season 枚举类时使用它的 description 字段作为字段值。

还有更简单的方法,就是使用 @JSONField(value = true)注解设置枚举类要序列化时使用的字段,下面的 jsonField 注解的使用这个章节中讲了。

jsonField 注解的使用

@Data
public class Student {
    @JSONField(ordinal = 2)
    private Integer age;
    private Season favoriteSeason;
    @JSONField(ordinal = 1)
    private String name;
    @JSONField(format = "yyyyMMdd")
    private Date birthday;
    @JSONField(serialize = false)
    private String address;
    @JSONField(deserialize = false)
    private String favoriteFood;
    @JSONField(name = "GENDER")
    private Gender gender;
}

@JSONField(ordinal = 2)注解设置了字段在序列化为 json 后的排列顺序,越小排在越前。
@JSONField(format = "yyyyMMdd")注解设置了在序列化 Date 类型的 birthday 字段时使用的日期格式。
@JSONField(serialize = false)注解设置了 address 字段不会被序列化,也就是序列化的结果中不会包含 address 字段。
@JSONField(deserialize = false)注解设置了将 json 序列化成 student 对象时不会序列化 favoriteFood 字段,也就是 favoriteFood 字段会为 null
@JSONField(name = "GENDER")注解设置了 gender 字段序列化成 json 时的字段名为 GENDER。

如果类的字段是 public 并且有 get 和 set 方法,@JSONField(deserialize = false) 会失效。bean 类都尽量标准一点,属性都设置为 private,提供 get 和 set 方法,这样会减少异常的发生。

@Getter
public enum Season {
    SPRING("春天", "万物复苏"),
    SUMMER("夏天", "热"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬季", "冷");

    private final String description;

    @JSONField(value = true)
    private final String features;

    Season(String description, String features) {
        this.description = description;
        this.features = features;
    }
}

@JSONField(value = true)设置了 Season 枚举类序列化成 json 时会使用 features 字段做为其值,而不是默认使用的枚举常量。

jsonPath 从 json 字符串中读取字段值

String str = "{\"address\":\"翻斗大街翻斗花园二号楼1001室\",\"favoriteFood\":\"炸小肉丸\",\"name\":\"图图\",\"age\":3,\"id\":10}";

JSONPath path = JSONPath.of("$.id");
JSONReader parser = JSONReader.of(str);
Integer result = (Integer) path.extract(parser);

System.out.println(result);

上面的代码实现了从 json 字符串中读取 id 字段的值。

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Fastjson是一个Java语言编写的高性能JSON处理库,可以实现JSON字符串与Java对象之间的相互转换。下面是一个简单的示例,演示了如何使用Fastjson进行JSON的序列化和反序列化: 1. 导入Fastjson的依赖包到你的项目中。你可以在Maven或Gradle配置文件中添加以下依赖: ```xml <!-- Maven --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.78</version> </dependency> // Gradle implementation 'com.alibaba:fastjson:1.2.78' ``` 2. 创建一个Java对象,例如: ```java public class Person { private String name; private int age; // getters and setters } ``` 3. 将Java对象转换JSON字符串: ```java import com.alibaba.fastjson.JSON; Person person = new Person(); person.setName("John"); person.setAge(25); String jsonString = JSON.toJSONString(person); System.out.println(jsonString); ``` 这将输出以下JSON字符串: ```json {"age":25,"name":"John"} ``` 4. 将JSON字符串转换Java对象: ```java String jsonString = "{\"name\":\"John\",\"age\":25}"; Person person = JSON.parseObject(jsonString, Person.class); System.out.println(person.getName()); System.out.println(person.getAge()); ``` 这将输出: ``` John 25 ``` 这只是Fastjson的基本用法示例,你还可以使用Fastjson进行更复杂的JSON处理操作,例如处理嵌套对象、数组等。你可以参考Fastjson的官方文档(https://github.com/alibaba/fastjson/wiki/Quick-Start)了解更多用法和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值