• 【Android -- 开源库】fastjson 基本使用


    在这里插入图片描述

    一、介绍

    fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

    优点

    • 速度快
      fastjson 相对其他 JSON库的特点是快,从2011年 fastjson 发布 1.1.x 版本之后,其性能从未被其他Java实现的JSON库超越。

    • 使用广泛
      fastjson 在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。

    • 测试完备
      fastjson有非常多的testcase,在1.2.11版本中,testcase 超过3321个。每次发布都会进行回归测试,保证质量稳定。

    • 使用简单
      fastjson的API十分简洁。

    • 功能完备
      支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

    二、使用

    1. 添加依赖

    implementation 'com.alibaba:fastjson:1.2.76'
    
    • 1

    2. json 字符串和 jsonObject 的转换

    String user = "{\"id\":2,\"name\":\"lily\",\"age\":12}";
    //将json字符串转json对象,Feature.OrderedField防止乱序
    JSONObject jsonObject = JSON.parseObject(user, Feature.OrderedField);
    //toJSONString方法将json对象转json字符串
    String user1 = jsonObject.toJSONString(); 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. json 字符串与 jsonArray 的转换

    String user = "[{\"id\":2,\"name\":\"lily\",\"age\":12},{\"id\":3,\"name\":\"mary\",\"age\":23}]";
    //json字符串转jsonArray
    JSONArray jsonArray = JSON.parseArray(user);
    for (Object o : jsonArray){
        JSONObject j = (JSONObject) o;
        Long id  = j.getLong("id");
        String name = j.getString("name");
    }
    ///jsonArray转json字符串
    String userString = jsonArray.toJSONString();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. jsonObject,jsonArray 嵌套

    String user = "{\"id\":12,\"name\":\"wei\",\"teacher\":{\"name\":\"kasa\",\"age\":77},\"student\":[{\"id\":2,\"name\":\"lily\",\"age\":12},{\"id\":3,\"name\":\"mary\",\"age\":23}]}";
    JSONObject jsonObject = JSON.parseObject(user);
    Long id  = jsonObject.getLong("id");
    String name = jsonObject.getString("name");
    JSONObject jsonObjectTeacher = jsonObject.getJSONObject("teacher");
    String teacherName = jsonObjectTeacher.getString("name");
    JSONArray jsonArray = jsonObject.getJSONArray("student");
    for (Object o : jsonArray){
        JSONObject j = (JSONObject) o;
        Long studentId  = j.getLong("id");
        String studentName = j.getString("name");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5. json 字符串与 jsonbean 转换

    String userString = "{\"id\":2,\"name\":\"lily\",\"age\":12}";
    //json字符串转javabean
    User user = JSON.parseObject(userString, new TypeReference<User>(){});
    //javabean转json字符串
    String userJsonString = JSON.toJSONString(user);
    //javabean转jsonObject
    JSONObject jsonObject = (JSONObject) JSON.toJSON(user);
    
    String userArrayString = "[{\"id\":2,\"name\":\"lily\",\"age\":12},{\"id\":3,\"name\":\"mary\",\"age\":23}]";
    //jsonArray转javabean集合
    ArrayList<User> userList = JSON.parseObject(userArrayString, new TypeReference<ArrayList<User>>(){});
    
    //对象转map
    Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user), new TypeReference<Map<String,Object>>(){});
    
    //map转对象
    org.apache.commons.beanutils.BeanUtils.populate(obj, map);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    三、超大 json 文件解析

    通过使用 JSON Stream Api 解析超大 json 文件。

    String FILE_PATH = "C:\\Users\\Administrator\\Desktop\\user.json";
    JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
    jsonReader.startArray();
    while(jsonReader.hasNext())
    {
        /*3种方式取得json
       1.转成json对象
        JSONObject jsonObject = (JSONObject) jsonReader.readObject();
        String name = jsonObject.getString("name");
        System.out.println(name);
        2.通过JSONStreamContext对象迭代
        jsonReader.startObject();
        while(jsonReader.hasNext()) {
            String objKey = jsonReader.readString();
            String objVal = jsonReader.readObject().toString();
            System.out.println("key: " + objKey + ", value: " + objVal);
        }
        jsonReader.endObject();
        3.转成javabean
        User user = jsonReader.readObject(User.class);*/
    }
    jsonReader.endArray();
    jsonReader.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    四、序列化扩展

    1. PropertyPreFilter 根据 PropertyName 判断是否序列化

    PropertyPreFilter filter = new PropertyPreFilter() {
        @Override
        public boolean apply(JSONSerializer jsonSerializer, Object o, String s) {
            if ("id".equals(s)) {
                return true;
            }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2. PropertyFilter 根据 PropertyName 和 PropertyValue 来判断是否序列化

    PropertyFilter filter = new PropertyFilter() {
        @Override
        public boolean apply(Object source, String name, Object value) {
            // 属性是id并且大于等于100时进行序列化
            if ("id".equals(name)) {
                long id = ((Long) value).longValue();
                return id >= 100;
            }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. NameFilter 修改 Key,如果需要修改 Key,process 返回值则可

    NameFilter filter = new NameFilter() {
        @Override
        public String process(Object object, String name, Object value) {
            // 属性是id是修改id的名字
            return name + "$";
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4. ValueFilter 修改 Value

    ValueFilter filter = new ValueFilter() {
        @Override
        public Object process(Object object, String name, Object value) {
            return value+ "$";
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5. BeforeFilter 序列化时在最前添加内容

    BeforeFilter filter = new BeforeFilter() {
        @Override
        public void writeBefore(Object object) {
            User user = (User) object;
            user.setName(user.getName() + "$$$");
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6. AfterFilter 序列化时在最后添加内容

    AfterFilter filter = new AfterFilter() {
        @Override
        public void writeAfter(Object object) {
            User user = (User) object;
            user.setName(user.getName() + "$$$");
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    五、数据格式转换 SerializerFeature

    WriteMapNullValue 是否输出值为 null 的字段,默认为 false

    WriteNullListAsEmpty List 字段如果为 null, 输出为 [], 而非 null
    
    WriteNullStringAsEmpty 字符类型字段如果为 null, 输出为”“, 而非 null
    
    WriteNullNumberAsZero 数值字段如果为 null, 输出为 0, 而非 null
    
    WriteNullBooleanAsFalse Boolean 字段如果为 null, 输出为 false, 而非 null
    
    DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为 false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    SerializerFeature feature = SerializerFeature.DisableCircularReferenceDetect;
    String userString = JSON.toJSONString(maps,feature);
    
    • 1
    • 2

    在 springboot 中使用:
    自定义类继承 WebMvcConfigurerAdapter,重写 configureMessageConverters () 方法

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        FastJsonHttpMessageConverter fastConverters = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.WriteNullNumberAsZero
        );
        fastConverters.setFastJsonConfig(fastJsonConfig);
        converters.add(fastConverters);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    .NET周刊【2月第2期 2024-02-11】
    Tensorboard如何启动|详细步骤(windows与Ubuntu皆可用)
    走进Spring Boot的世界
    HarmonyOS应用开发入门(五)
    Happens-Before规则详解
    SpringMvc中RequestMapping注解
    【Rust基础①】基本类型、所有权与借用、复合类型
    surging 将推出社区版微服务平台
    Android 混淆使用及其字典混淆(Proguard)
    [NOIP2018 普及组] 龙虎斗题解
  • 原文地址:https://blog.csdn.net/duoduo_11011/article/details/126746854