Alibaba FastJson
Alibaba FastJson
Json简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 由 键值对 构成,采用树状结构组织数据。键名必须用双引号包裹。值可以是字符串、数字、布尔值、null、数组或对象。
Json的基本数据结构如下:
| 类型 | 示例 | 说明 | 
|---|---|---|
| 字符串 | "hello" | 用双引号包裹的字符序列 | 
| 数字 | 123 | 整数或浮点数 | 
| 布尔值 | true、 false | 表示真或假 | 
| null | null | 表示空值 | 
JSON结构类型如下:
| 类型 | 示例 | 说明 | 
|---|---|---|
| 对象 | 键值对集合,用花括号包裹 | |
| 数组 | [1, 2, 3] | 有序的值集合,用方括号包裹 | 
JSON 支持无限层级嵌套,形成树形结构:
{
    "name": "John",
    "age": 30,
    "isStudent": true,
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    },
    "hobbies": ["reading", "traveling", "cooking"]
}
FastJson介绍
FastJson是阿里巴巴的开源JSON解析库;
主要功能:
- 序列化:将JavaBean序列化为JSON字符串;
 - 反序列化:从JSON字符串反序列化到JavBean;
 
FastJson使用
导入依赖包
导入FastJson依赖包
<!--阿里巴巴FastJson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.23</version>
</dependency>
String转Json
JSON字符串转为JSON对象;
//JSON字符串转为JSON对象
String jsonString = "{\"name\":\"Tom\",\"id\":10,\"false\":true}";
JSONObject jsonObject = JSON.parseObject(jsonString);
//获取Json对象值
System.out.println(jsonObject.getString("name"));
System.out.println(jsonObject.getInteger("id"));
System.out.println(jsonObject.getBoolean("false"));
JSON数组字符串转为JSON数组:
//JSON数组字符串转为JSON数组
String str = "[\"张三\",\"18\",\"宜昌\"]";
JSONArray jsonArray = JSON.parseArray(str);
//获取JSON数组对象的值(JSON数组中的类型分别为:String,Integer,String)
System.out.println(jsonArray.getString(0));
System.out.println(jsonArray.getInteger(1));
System.out.println(jsonArray.getString(2));
String转JavaBean
JSON字符串转JavaBean对象:
String jsonString = "{\"name\":\"Tom\",\"id\":10,\"config\":[{\"subKey\":\"0001\",\"devNo\":10000,\"payloads\":{\"model\":1,\"power\":true}},{\"subKey\":\"0002\",\"devNo\":20000,\"payloads\":{\"model\":1,\"power\":false}}]}";
User user = JSON.parseObject(jsonString, User.class);
Obejct(JavaBean)转String
包括JSONObject、JSONArray、JavaBean、数组、List、Set、Map都可以通过这种方式转String:
String jsonStr = JSON.toJSONString(object);
JSON注解
这是一个注解,用于配置在JavaBean,可以配置在getter/setter方法或者字段上,也可以直接配置在属性上。
注意:若属性是私有的,必须有set*方法。否则无法反序列化。
@JSONField(ordinal=1)//配置序列化的字段顺序(1.1.42版本之后才支持)
@JSONField(serialize=false) //是否参与序列化:该字段不输出  但是如果加了final,这个字段就无法被过滤
@JSONField(derialize=false) //是否参与反序列化:该字段不输出  但是如果加了final,这个字段就无法被过滤 
@JSONField(format="yyyy-MM-dd HH:mm:ss") //日期按照指定格式序列化
@JSONField(name="别名");//使用字段别名
@JSONField(serialzeFeatures={SerialzeFeatures属性});//序列化规则
@JSONField(parseFeatures={Features属性});//反序列化规则
开发使用
使用的测试类如下:
package com.tahacoo.exercise.fastjson;
import lombok.*;
import java.util.List;
@Data
@Builder
public class User {
    private String name;
    private Integer id;
    private List<Task> config;
    @Data
    public static class Task{
        //设备key值
        private String subKey;
        //设备编号
        private Integer devNo;
        //设备控制状态
        private Object payloads;
    }
}
注意:内部静态类也需要set和get方法;
练习:
获取Json对象中的config属性中的payloads,将payloads中的power字段对应的true/false值,转变为1/0值;
示例:payloads":{"model":1,"power":true},转变后:payloads":{"model":1,"power":1}
思路如下:
- 将json字符串转换为JavaBean对象user;
 - 获取user中的payloads属性,将Object对象转换为JSONObject对象;
 - 获取JSONObject对象中的值,判断后,重新赋值;
 
对应代码如下:
 public static void exercises(){
        ArrayList<Boolean> strings = new ArrayList<>();
        String jsonString = "{\"name\":\"Tom\",\"id\":10,\"config\":[{\"subKey\":\"0001\",\"devNo\":10000,\"payloads\":{\"model\":1,\"power\":true}},{\"subKey\":\"0002\",\"devNo\":20000,\"payloads\":{\"model\":1,\"power\":false}}]}";
        //将json字符串转化为JavaBean对象;
        User user = JSON.parseObject(jsonString, User.class);
        user.getConfig().forEach(config->{
        //将Object对象转换为JSONObject对象
        JSONObject jsonObject = (JSONObject) JSON.toJSON(config.getPayloads());
        if (jsonObject.containsKey("power")){
        //判断后,重新赋值
        jsonObject.put("power",jsonObject.getBoolean("power") ? 1 : 0);
        }
        //jsonObject.computeIfPresent("power",(key, value)->((Boolean)value ? 1: 0));
        strings.add(jsonObject.getBoolean("power"));
        });
        //将JavaBean对象转换为Json字符串
        String userJsonString = JSON.toJSONString(user);
        System.out.println(String.format("userJson: %s", userJsonString));
}
                    
                
                
            
        
浙公网安备 33010602011771号