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

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数据动态过滤字段

原文地址:https://blog.csdn.net/qq_49474843/article/details/146299662
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/591699.html

相关文章:

  • Spring Boot 整合 Nacos 注册中心终极指南
  • JavaSE-String字符串
  • Git 实战指南:本地客户端连接 Gitee 全流程
  • ngx_http_core_srv_conf_t
  • pytorch小记(十二):pytorch中 masked_fill_() vs. masked_fill() 详解
  • 《我的Python觉醒之路》之转型Python(十三)——控制流
  • Trae插件革命:用VSPlugin Helper实现VSCode市场插件全自动安装
  • RabbitMQ常见问题总结
  • Laravel框架下通过DB获取数据并转为数组的方法
  • 宝石PDF,全新 PC 版本,全部免费
  • CSS中z-index使用详情
  • C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval
  • LeetCode 第14~16题
  • 第29周 面试题精讲(4)
  • KNN算法性能优化技巧与实战案例
  • vue网格布局--grid布局
  • 采用贝塞尔函数,进行恒定束宽波束形成算法
  • 如何用AI制作PPT,轻松实现高效演示
  • Node.js 和 Vite 配置文件中`__dirname`
  • Mysql如何解决幻读问题