当前位置: 首页 > news >正文

FastJson:JSON JSONObject JSONArray详解以及SimplePropertyPreFilter 的介绍

FastJson:JSON JSONObject JSONArray详解以及SimplePropertyPreFilter 的介绍

FastJson是阿里巴巴开发的一款专门用于Java开发的包,实现Json对象,JavaBean对,Json字符串之间的转换。


文章目录

  • FastJson:JSON JSONObject JSONArray详解以及SimplePropertyPreFilter 的介绍
  • 一、JSON对象介绍
  • 二、FastJson-JSON
  • 三、FastJson-JSONObject
  • 四、FastJson-JSONArray
  • 五、常用方法汇总
    • 常用方法
    • 简单说一下FastJSON的JSON过滤器


一、JSON对象介绍

JSON的特点如下:

  1. 数据在花括号中。
  2. 数据以"键:值"对的形式出现(其中键多以字符串形式出现,值可取字符串,数值,甚至其他json对象)。
  3. 每两个"键:值"对以逗号分隔(最后一个"键:值"对省略逗号)。

例:

普通Json对象
{
    "ID": 1001,
    "name": "张三",
    "age": 24}
数组Json对象
[
    {"ID": 1001, "name": "张三", "age": 24},
    {"ID": 1002, "name": "李四", "age": 25},
    {"ID": 1003, "name": "王五", "age": 22}
]

复杂Json对象
{
    "部门名称":"研发部",
    "部门成员":[
    {"ID": 1001, "name": "张三", "age": 24},
    {"ID": 1002, "name": "李四", "age": 25},
    {"ID": 1003, "name": "王五", "age": 22}],
    "部门位置":"xx楼21号"
}

二、FastJson-JSON

JSON是一个抽象类并且实现了JSONStreamAware, JSONAware接口,提供了JSON转换的方法(详细方法说明看后文)。

JSON多用于JavaBean->JSONString 或者 JSONString->javaJSON

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {
    @JSONField(name = "student_name",ordinal = 1)
    private String name;
    @JSONField(name = "student_age",ordinal = 2)
    private Integer age;
}
 @Test
    public void beanJsonTest() {
        StudentEntity student = StudentEntity.builder().name("张三").age(18).build();
        
        String jsonStudentString = JSON.toJSONString(student); //{"student_name":"张三","student_age":18}
        StudentEntity studentObject = JSON.parseObject(jsonStudentString, StudentEntity.class);  //转为java对象
    }

三、FastJson-JSONObject

JSONObject继承了JSON并实现了Map接口。

底层是个Map集合,多用于操作JSONObject 如取属性等,Map集合的功能也都有。

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {
    @JSONField(name = "student_name",ordinal = 1)
    private String name;
    @JSONField(name = "student_age",ordinal = 2)
    private Integer age;
}
 @Test
    public void beanJsonTest() {
        StudentEntity student = StudentEntity.builder().name("张三").age(18).build();
        String jsonStudentString = JSON.toJSONString(student); //{"student_name":"张三","student_age":18}
        /**
        Map<String,Object> map = new HashMap<>();
        map.put("student_name", "李四");
        map.put("student_age", 19);
        map.put("date",students);
        JSONObject jsonObject = new JSONObject(map);
        **/
        JSONObject jsonObject = JSONObject.parseObject(jsonStudentString); //{"student_name":"张三","student_age":18}
        jsonObject.put("student_name", "李四");
        jsonObject.put("student_age", 19);//{"student_name":"李四","student_age":19}
        jsonObject.put("date",student);//{"student_name":"张三","student_age":18,"date":[{"student_name":"张三","student_age":18},{"student_name":"张三","student_age":18},{"student_name":"张三","student_age":18}]}
        //get方法  根据key取出value
        StudentEntity date = jsonObject.getObject("date", StudentEntity.class);
        String studentName = jsonObject.getObject("student_name", String.class);
        jsonObject.getString("student_name");
    }

四、FastJson-JSONArray

JSONObject继承了JSON并实现了List接口。

底层是个ArrayList,多用于用于操作JSONArray 比如遍历等,通常与JSONObject联合使用。

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity {
    @JSONField(name = "student_name",ordinal = 1)
    private String name;
    @JSONField(name = "student_age",ordinal = 2)
    private Integer age;
}
    @Test
    public void twoTest3() {
        StudentEntity student1 = StudentEntity.builder().name("张三").age(18).build();
        StudentEntity student2 = StudentEntity.builder().name("张三").age(18).build();
        StudentEntity student3 = StudentEntity.builder().name("张三").age(18).build();
        ArrayList<StudentEntity> students = Lists.newArrayList(student1, student2, student3);
        JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(students));
        jsonArray.forEach(item -> {
            String jsonStudentStringItem = JSONObject.toJSONString(item);
            System.out.println(jsonStudentStringItem);
        });
        //{"student_name":"张三","student_age":18}
        //{"student_name":"张三","student_age":18}
        //{"student_name":"张三","student_age":18}
 
        JSONObject StudentJson = new JSONObject();
        StudentJson.put("Student",jsonArray);
        System.out.println(StudentJson.toJSONString());
    }

在这里插入图片描述

五、常用方法汇总

常用方法

  /**
     * FastJson常用方法
     */
    @Test
    public void fastJSONTest() {
        StudentEntity student = StudentEntity.builder().name("张三").age(18).build();
    //1.JSON常用方法
    
        //1.1  toJSONString :将java对象转为JSONString
        String jsonStudentString = JSON.toJSONString(student);//{"student_name":"张三","student_age":18}

        //1.2  parseObject :将JSONString转为java对象
        StudentEntity studentObject = JSON.parseObject(jsonStudentString, StudentEntity.class);//StudentEntity(name=张三, age=18)

        // 1.3 JSONtoJSONBytes():将 Java 对象序列化为 JSON 字节数组
        byte[] jsonStudentStringBytes = JSON.toJSONBytes(student);//[123, 34, 115, 116, 117, 100, 101, 110, 116, 95, 110, 97, 109, 101, 34, 58, 34, 228, 189, 254, 228, 184, 230, 34, 44, 34,115, 116, 117, 100, 101, ]

        //1.4 JSONparseBytes():将 JSON 字节数组反序列化为 Java 对象
        StudentEntity studentObject2 = JSON.parseObject(jsonStudentStringBytes, StudentEntity.class);

        //1.5 JSON.parseObject:将Java对象转为JSONObject
        JSONObject jsonObject = JSON.parseObject(jsonStudentString);

    //2.JSONObject常用方法 JSONObject继承了JSON类,并实现了Map接口,所以可以调用JSON类中的方法,并且重写了Map相关方法
    
        //2.1 JSONObject.toJSONString():将JSONObject转为JSONString
        String jsonStudentString2 = jsonObject.toJSONString();//{"student_name":"张三","student_age":18}

        //2.2 JSONObject.put():根据key设置value
        jsonObject.put("STUDENT", StudentEntity.builder().name("王五").age(22).build());//{"student_name":"张三","student_age":18,"STUDENT":{"student_name":"王五","student_age":22}}

        //2.3 JSONObject.getXxx():根据key取出value
        String studentName = jsonObject.getString("student_name");//张三
        Integer studentAge = jsonObject.getInteger("student_age");//18
        /* String name = jsonObject.getObject("name", String.class);
        Integer age = jsonObject.getObject("age", Integer.class);*/
        StudentEntity studentObject3 = jsonObject.getObject("STUDENT", StudentEntity.class);//StudentEntity(name=王五, age=22)

        //2.4 toJavaObject:将JSONObject转为Java对象
        StudentEntity javaObject = jsonObject.toJavaObject(StudentEntity.class);

        //2.5 putAll():合并两个JSONObject
        String json1 = "{\"name\":\"Jack\"}";
        String json2 = "{\"age\":35}";
        JSONObject jsonObject1 = JSON.parseObject(json1);
        JSONObject jsonObject2 = JSON.parseObject(json2);
        JSONObject jsonObject3 = new JSONObject();
        jsonObject3.putAll(jsonObject1);
        jsonObject3.putAll(jsonObject2);//{"name":"Jack","age":35}

        //2.6 isEmpty():判断JSONObject是否为空
        boolean empty = jsonObject.isEmpty();
        //containsKey() keySet() vlues() clear() remove() containsValue() 跟Map集合的方法一样 不在列举

    //3.JSONArray常用方法
        //3.1. parseArray:将Java对象转为JSONArray
        StudentEntity student1 = StudentEntity.builder().name("张三1").age(18).build();
        StudentEntity student2 = StudentEntity.builder().name("张三2").age(18).build();
        StudentEntity student3 = StudentEntity.builder().name("张三3").age(18).build();
        ArrayList<StudentEntity> studentEntities = Lists.newArrayList(student1, student2, student3);
        JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(studentEntities));//[{"student_name":"张三1","student_age":18},{"student_name":"张三2","student_age":18},{"student_name":"张三3","student_age":18}]
        
        //3.2. toJSONString():将JSONArray转为JSONString
        String jsonArrayString = jsonArray.toJSONString();//"[{"student_name":"张三1","student_age":18},{"student_name":"张三2","student_age":18},{"student_name":"张三3","student_age":18}]
        
        //3.3. toJavaObject():将JSONArray转为Java对象
        List<StudentEntity> studentEntities1 = jsonArray.toJavaList(StudentEntity.class);

        
        // forEach(),fparallelStream(),stream(),spliterator(),iterator(),sort(),get()这些Arraylist方法同样都有,不在列举

    }

简单说一下FastJSON的JSON过滤器

SimplePropertyPreFilter 简单过滤器

class Person {
    public String name;
    public int age;
}
@Test
    public void toJSONStringWithFilterExample() {
        Person person = new Person();
        person.name = "Eve";
        person.age = 40;

    // SimplePropertyPreFilter类 实现 JSON字符串过滤
    SimplePropertyPreFilter simplePropertyPreFilter1 = new SimplePropertyPreFilter();

	//添加过滤字段
    simplePropertyPreFilter1.getExcludes().add("age");//不包括 "age" 字段
    //调用toJSONString将Java转String时传入过滤器
    System.out.println(JSON.toJSONString(person, simplePropertyPreFilter1));//{"name":"Eve"}

//或者

    SimplePropertyPreFilter simplePropertyPreFilter2 = new SimplePropertyPreFilter();
    //添加保留字段
    simplePropertyPreFilter2.getIncludes().add("name");//包括 "name" 字段
     //调用toJSONString将Java转String时传入过滤器
    System.out.println(JSON.toJSONString(person, simplePropertyPreFilter2));//{"name":"Eve"}
}

自定义过滤器
FastJson提供的简单过滤器很多时候无法满足我们需求,这个时候就可以自定义管理器

@Test
    public void toJSONStringWithFilterExample2() {
        Person person = new Person();
        //1.实现 ValueFilter 接口 重写 process 方法
        ValueFilter filter = (object, name, value) -> {
            if (name.equals("age")) {
                return null; // 不包括 "age" 字段
            }
            return value;
        };
        
        // 2.实现 PropertyFilter 接口 重写 apply 方法
        PropertyFilter filter2 = (object, name, value) -> {
            if (name.equals("age")) {
                return false; // 不包括 "age" 字段
            }
            return true;
        };


        String jsonString1 = JSON.toJSONString(person, filter);//{"name":"Eve"}
        String jsonString2 = JSON.toJSONString(person, filter2);//{"name":"Eve"}
    }

当然还可以根据管理器实现原来去手搓来增填功能,深入了解推荐一篇文章
API接口使用Jackson序列化JSON数据动态过滤字段

相关文章:

  • 虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用
  • RAG工具框架针对的常见问题
  • 前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” !!!
  • LeetCode 第19~21题
  • 【Qt】信号signal是单向的
  • YZi Labs 谈对 Plume 的投资:利用区块链创造现实价值的典范项目
  • 【C++】STL库面试常问点
  • Java基礎2小時速成(下篇) - 掌握核心技术「卷」
  • 【嵌入式学习】嘉立创画pcb门电路
  • Android 动态代理详解
  • 麒麟操作系统作为服务器,并且需要在浏览器上调试 MATLAB
  • LangChain组件Tools/Toolkits详解(1)——Tools接口与创建工具概述
  • Certd自动化申请和部署SSL证书并配置https
  • Go 语言常量
  • Nvidia 官方CUDA课程学习笔记
  • 【ESP32】虚拟机Ubuntu20.04下ESP32环境搭建
  • $set 方法废弃
  • 设计模式(创建型)-工厂模式
  • RK3568 Android11 sh366006驱动
  • HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT)(文末有下载方式)
  • 多地征集农村假冒伪劣食品违法线索,全链条整治“三无”产品
  • 在上海生活8年,13岁英国女孩把城市记忆写进歌里
  • 我国对国家发展规划专门立法
  • 新任浙江省委常委、组织部长杨荫凯到嘉兴南湖瞻仰红船
  • 体坛联播|巴萨“三杀”皇马夺国王杯,陈妤颉破亚洲少年纪录
  • 保时捷中国研发中心落户上海虹桥商务区,计划下半年投入运营