JSON序列化以及JSON反序列

JSON序列化以及JSON反序列,第1张

JSON序列化以及JSON反序列

JSON序列化数组对象以及JSON反序列
  • 简单说明
    • 补充
  • 工具
    • FastJson
      • 对象与Json的String类型的转换
      • List<>数组与Json的String类型的转换
    • hutool工具类
      • 对象与Json的String类型的转换
      • List<>数组与Json的String类型的转换
    • JackSon
      • 对象与Json的String类型的转换
      • List<>数组与Json的String类型的转换
    • 总结

简单说明

关于json是什么我就不多去介绍了

以下只对 json格式的String类型 和 对象或数组 进行转换

如果需要将数据转json必须要分成以下两种情况,反序列化也一样

  • List<> 数组转JSON
  • 对象转JSON

map<>集合实际上就是对象;
set<>数组将相当与List<>数组 。

补充

如果目前正在企业上班的hxd先去问下部门的同事目前是否在用着hutool工具类。主题考虑一下目前使用的技术栈吧。毕竟如果后期淘汰了某些技术,你还需要回头来改这些。

↓ 还未上班的我们继续 ↓

工具
FastJson

依赖地址:https://mvnrepository.com/artifact/com.alibaba/fastjson

工具包名:com.alibaba.fastjson.JSON
注意:包别导错了!特别用了多种不同工具类的包会直接报错

对象与Json的String类型的转换

实体类Neo.class

//这些是lombok的注释标签,自行编写set,get等方法也行
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@ToString
public class Neo {
  private int id;
  private String name;
}

测试类主体:

  @Test
  public void ObjTest(){
  	Neo object = new Neo(1,"象象");
    //Json序列化对象并存入String
    //(注意要判空!虽然不会报错,但是会调用对象的无参构造方法,会引起参数的错误判断)
    //if (object!=null)
    //objStr => {"id":1,"name":"象象"}
    String objStr = JSON.toJSONString(object);

    //反序列化json并转换为java类
    //neo.toString => Neo(id=1, name=象象)
    Neo neo = JSON.parseObject(objStr).toJavaObject(Neo.class);
    //只取JsonObj的部分数据>>直接调对应的get方法就好了
    JSON.parseObject(objStr).getInteger("id");
    JSON.parseObject(objStr).getString("name");
  }

List<>数组与Json的String类型的转换

测试类主体:

  @Test
  public void ListTest(){
  	//新建个数组[1,2,3](我以Integer类型为例,List里边存对象也是可以的)
	List list = new ArrayList(){{
    add(1);
    add(2);
    add(3);
  	}};
    //json序列化数组(注意要判空!不然会传入  jsonList="[]"反序列化时会出错 )
    //if (list!=null && list.size()!=0)
    String listStr = JSON.toJSONString(list);
    //反序列化json数组并指定对象
    List ints = JSON.parseArray(listStr,Integer.class);
  }

以上就是FastJson的简单使用


hutool工具类

hutool All依赖地址:https://mvnrepository.com/artifact/cn.hutool/hutool-all
hutool JSON依赖地址:https://mvnrepository.com/artifact/cn.hutool/hutool-json
这两个依赖导一个就行了,hutool All内含了hutool JSON

工具包名:cn.hutool.json.JSONUtil
注意:包别导错了!特别用了多种不同工具类的包会直接报错

对象与Json的String类型的转换

实体类Neo.class

//这些是lombok的注释标签,自行编写set,get等方法也行
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@ToString
public class Neo {
  private int id;
  private String name;
}

测试类主体:

  @Test
  public void ObjTest(){
    Neo object = new Neo(1,"象象");
    // json序列化对象
    //(注意要判空!虽然不会报错,但是会调用对象的无参构造方法,会引起参数的错误判断)
    // jsonObjStr => {"id":1,"name":"象象"}
    String jsonObjStr = JSONUtil.toJsonStr(object);
    // 反序列化json对象并指定对象
    // neo1.toString => Neo(id=1, name=象象)
    Neo neo1 = JSONUtil.toBean(jsonObjStr,Neo.class);
    // 取jsonStr反序列化的部分
    JSONObject jsonObject = JSONUtil.parseObj(jsonObjStr);
    Integer id = jsonObject.get("id", Integer.class);
    String name = jsonObject.get("name", String.class);
  }

List<>数组与Json的String类型的转换

测试类主体:

  @Test
  public void ListTest(){
  	//初始化一个数组(我以Integer类型为例,List里边存对象也是可以的)
    List list = new ArrayList(){{
    add(1);
    add(2);
    add(3);
 	}};
    //json序列化数组(注意要判空!不然会传入  jsonList="[]"反序列化时会出错 )
    String jsonList = JSONUtil.toJsonStr(list);
    //反序列化json数组并指定对象()
    List ints = JSONUtil.parseArray(jsonList).toList(Integer.class);
  }


JackSon

jackson-core依赖地址:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
jackson-databind依赖地址:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
jackson-annotations依赖地址:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations

工具包名:com.fasterxml.jackson.*
注意:包别导错了!特别用了多种不同工具类的包会直接报错

对象与Json的String类型的转换

实体类Neo.class

//这些是lombok的注释标签,自行编写set,get等方法也行
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@ToString
public class Neo {
  private int id;
  private String name;
}

测试类主体

  @Test
  public void ObjTest(){
    ObjectMapper mapper = new ObjectMapper();
    try {
      Neo object = new Neo(1,"象象");
      // json序列化对象
      //(注意要判空!虽然不会报错,但是会调用对象的无参构造方法,会引起参数的错误判断)
      // objStr => {"id":1,"name":"象象"}
      String objStr = mapper.writevalueAsString(object);
      // 反序列化json对象并指定对象
      // neo.toString => Neo(id=1, name=象象)
      Neo neo = mapper.readValue(objStr,Neo.class);
    } catch (JsonProcessingException e) {
      e.printStackTrace();
    }
  }

List<>数组与Json的String类型的转换

实体类Neo.class

//这些是lombok的注释标签,自行编写set,get等方法也行
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@ToString
public class Neo {
  private int id;
  private String name;
}

测试类主体:

  @Test
  public void ListTest(){
  	//构建list<>数组
	List objList = new ArrayList(){{
	    add(new Neo(1,"象象"));
	    add(new Neo(2,"象象"));
	    add(new Neo(3,"象象"));
  	}};
    ObjectMapper mapper = new ObjectMapper();
    try {
      // json序列化数组
      // (注意要判空!不然会传入  jsonList="[]"反序列化时会出错 )
      // if (list!=null && list.size()!=0)
      // listStr => [{"id":1,"name":"象象"},{"id":2,"name":"象象"},{"id":3,"name":"象象"}]
      String listStr = mapper.writevalueAsString(objList);

      // 反序列化json数组并指定类型
      // 声明集合类型,使用mapper.getTypeFactory().constructParametricType(Class CollectionType,Class ParamType)
      // 如过List里边为Integer等基础类型封装类,也可以直接使用mapper.readValue(objStr,List.class),不过不推荐
      JavaType javaType =  mapper.getTypeFactory().constructParametricType(List.class, Neo.class);
      // ints.toString => [Neo(id=1, name=象象), Neo(id=2, name=象象), Neo(id=3, name=象象)]
      List ints = mapper.readValue(listStr,javaType);
    } catch (JsonProcessingException e) {
      e.printStackTrace();
    }
  }


总结

目前总结了 Hutool、FastJson、JackSon 三种方法,各有个的好处;并没有什么排名的先后意思。后续还可能对Gson进行添加(我学的会的话
如果有什么什么更好的方法,欢迎在评论区评论

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5686658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存