json-数据通信-序列化-FastJSON-Jackson-Gson

应用场景:
    服务端返回给客户端的数据;java对象转json
    客户端返回给服务端 json转为java对象
    序列化与反序列化:FastJSON、Jackson、Gson
    序列化:把Java对象转换为字节序列的过程。
    反序列化:把字节序列恢复为Java对象的过程。
    对象的序列化主要有两种用途:
    持久化对象:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
    网络传输对象:在网络上传送对象的字节序列。
    implements Serializable、private static final long serialVersionUID = 8073662434406951441L;
    json独立于任何语言的文本格式:简称json字符串 
    1 json数据最外层必须是{},里面是k/v形式
    2 json字符串:
        let user = {"id":11,"name":"zs","age":44} ,js可直接输出,类似java对象
    3 json数组:k/v,js可直接输出
        let arr = {
            "p":[{"id":11,"name":"zs"},{"id":12,"name":"ls"}]
        }
    4 json集合:集合是用[]包裹,集合里直接就是一组一组的数据,js可直接输出
        let list=[
            {"id":11,"name":"zs"},
            {"id":13"name":"ls"}
        ]
json数据解析、转换:
    1 json字符串转java对象:后端收对象,前端收json串而返回的是对象,所以都要转换
      java bean序列化成json字符串,json字符串反序列化成java bean ;
fastjson-java对象转json串
    String jsonStr = JSON.toJSONString(obj);
fastjson-java数组转json数组    
    准备数据:User[] users ={u1,u2,u3};
    String jsonArrStr = JSON.toJSONString(users,true); //true是目标的格式化
fastjson-list集合转json集合
    List<User> ulist = new ArrayList();
    Collections.addAll(ulist,u1,u2,u3);
    String jsonListStr = JSON.toJSONString(ulist,true);//也可以不写第二个参数true,就是输出格式不一样而已
fastjson的注解:
    @JSONField(ordinal=1)加在属性上,表示用来展示将来转成json串的输出顺序,1表示排在第一个位置
    @JSONField(ordinal=1,name="xxx") 将来转成json串则以属性的这个name值输出
    //serialize则这个字段则在序列化时就不会存在即不参与序列化,不序列化了就没必须序列化ordinal=1排序了
    @JSONField(serialize=false) 
fastjson-json转java对象(bean)
    JSON.parseObject(strjson,Person.class); //json串转java对象,反序列化时必须要有无参构造
fastjson-json串转java数组或集合
    List<Person> pList = JSON.parseArray(strjson,Person.class);
gson-java对象转json:
    Gson gson = new Gson();
    gson.toJson(user,User.class);
gson-java集合转json(数组):    
    List<User> users = new ArrayList<>();
    gson.toJson(users); //没写范型
gson-json转java对象(bean):
    gson.fromJson(strjson,User.class);
gson-json串转java数组或集合    
    Type type = new TypeToken<ArrayList<User>>{}.getType;
    ArrayList<User> gson.fromJson(strjson,type);
jackson-java对象转json:
    //依赖jackson-databind      2.12.4 默认已经有了
    //jackson-datatype-jsr310    2.12.4 它包含上jackson-databind,引它就可以
    ObjectMapper objectMapper = new ObjectMapper();
    //注册日期处理的,如你的user中有日期,转换输出的日期格式显示可能有问题,所以可能需要这句
    //objectMapper.findAndRegisterModules();  【***】
    //可能还需要在你日期属性加@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    objectMapper.writeValueAsString(user);
jackson-java集合转json(数组):    
    List<User> users = new ArrayList<>();
    objectMapper.writeValueAsString(users);    
jackson-json转java对象(bean):
    objectMapper.readValue(jsonstr,User.class);
    objectMapper.readValue(jsonString,new TypeReference<ResponseBean<List<User>>>(){});
jackson-json串转java数组或集合    
    objectMapper.readValue(jsonstr,new TypeReference<List<User>>(){});
    //复杂点的
    有问题的写法:
        ResultBean r = objectMapper.readValue(jsonstr,ResultBean.class); 
        //要验证解析出来的里面的对象都对不对
        //ResultBean这样转出来里面的集合是个Object或LinkedHashMap类型,需要强转如:
        List<User> data = (List<User>) r.getData(); //打印发现不对
    正确的写法:
        ResultBean r = objectMapper.readValue(jsonstr,new TypeReference<ResultBean<List<User>>>(){}); 
jackson注解:
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") 日期属性转成json显示格式
    @JsonProperty("createDateTime") 指定属性转换为json字符串的key
    @JsnIgnore      属性单独使用这个注解,即转json时某个字段不想转成json,就是忽略字段的
    @JsonIgnoreProperties({"aaa","bbb"})  写在pojo类上标明哪写字段忽略
FastJSON、Jackson、Gson性能比测:
  1 序列化测试:
    数据量较少(1、10、100)的时候,Gson的性能最优,且优势较明显,当对象数量在1000的时候,Jackson的性能开始上来了,
        因此在对象数量在1~1000的时候,性能比拼:Gson>Jackson>FastJSON。
    数量达到10000、100000级别的时候,Gson的性能下降的比较厉害,而FastJson和Jackson依旧保持着它们的快,
        性能比较:Jackson>FastJSON>Gson
  2 反序列化测试
    对象数量为1、10、100的时候,Gson的性能最好,Jackson次之,性能排序为:Gson>Jackson>FastJson;
    在对象数量为1000、10000的时候,Gson的性能下降比较明显,这个量级下性能排序为:FastJson>Jackson>Gson。
    在对象数量为10w的时候,Jackson反超FastJson,性能排序为:Jackson>FastJson>Gson
  3 结论
    当数据量较小的时候(1~100),建议使用 Gson;
    当数据量较大的时候,建议使用Jackson;
    在大数据量的时候,虽然FastJson优势上来了,但是因为有漏洞,不得不放弃

猜你喜欢

转载自blog.csdn.net/gzi305366853/article/details/129916851