Android -- 开源库fastjson 基本使用

Posted Kevin-Dev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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'

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(); 

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();

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");

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);

三、超大 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. PropertyPreFilter 根据 PropertyName 判断是否序列化

PropertyPreFilter filter = new PropertyPreFilter() 
    @Override
    public boolean apply(JSONSerializer jsonSerializer, Object o, String s) 
        if ("id".equals(s)) 
            return true;
        
        return false;
    
;

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;
    
;

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

NameFilter filter = new NameFilter() 
    @Override
    public String process(Object object, String name, Object value) 
        // 属性是id是修改id的名字
        return name + "$";
    
;

4. ValueFilter 修改 Value

ValueFilter filter = new ValueFilter() 
    @Override
    public Object process(Object object, String name, Object value) 
        return value+ "$";
    
;

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

BeforeFilter filter = new BeforeFilter() 
    @Override
    public void writeBefore(Object object) 
        User user = (User) object;
        user.setName(user.getName() + "$$$");
    
;

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

AfterFilter filter = new AfterFilter() 
    @Override
    public void writeAfter(Object object) 
        User user = (User) object;
        user.setName(user.getName() + "$$$");
    
;

五、数据格式转换 SerializerFeature

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

WriteNullListAsEmpty List 字段如果为 null, 输出为 [], 而非 null

WriteNullStringAsEmpty 字符类型字段如果为 null, 输出为”“, 而非 null

WriteNullNumberAsZero 数值字段如果为 null, 输出为 0, 而非 null

WriteNullBooleanAsFalse Boolean 字段如果为 null, 输出为 false, 而非 null

DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为 false
SerializerFeature feature = SerializerFeature.DisableCircularReferenceDetect;
String userString = JSON.toJSONString(maps,feature);

在 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);

以上是关于Android -- 开源库fastjson 基本使用的主要内容,如果未能解决你的问题,请参考以下文章

阿里巴巴开源的 JSON 解析库 Fastjson 被曝高危漏洞,官方已发布安全公告

阿里巴巴FastJSON使用实例

Android -- 开源库MaterialEditText 的基本使用

Android入门(二十二)解析JSON

Android -- 开源库HelloCharts 的基本使用

Android -- 开源库权限适配 RxPermissions 的基本使用