1.  什么是 Json 序列化 和 反序列化

序列化 => 将 Java对象 转换成 json字符串
反序列化 => 将 json字符串 转换成 Java对象

2. 依赖包 说明

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
依赖包说明:
# 提供注解支持
Maven: com.fasterxml.jackson.core:jackson-annotations:2.7.0
# 核心功能支持
Maven: com.fasterxml.jackson.core:jackson-core:2.10.1
Maven: com.fasterxml.jackson.core:jackson-databind:2.7.4

3. ObjectMapper

    功能:
ObjectMapper 提供了 读写Json的功能
读:
public <T> T readValue(String content, Class<T> valueType)
将 字符串content 反序列化 成 Class<T>类型的对象 写(可以把JSON字符串保存File、OutputStream等不同的介质中):
public void writeValue(File resultFile, Object value)
将 Objec转成 json字符串,并保存到 指定 File 内 public void writeValue(OutputStream out, Object value)
将 Objec转成 json字符串,并保存到 指定 OutputStream 内(使用 UTF8 编码) public byte[] writeValueAsBytes(Object value)
将 Objec转成 json字符串,并把结果输出成 字节数组 public String writeValueAsString(Object value)
将 Objec转成 json字符串,并把结果输出成 字符串

4. Json 注解

    @JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性

    @JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")。
示例: @JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss") @JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称
示例: @JsonProperty("AliasName")

5. Bean对象 => Json 字符串 (Json 序列化)

// TODO 用来转换的 Bean
case class UserBean(@BeanProperty name: String
, @BeanProperty age: Int
, @BeanProperty birthday: Date
, @BeanProperty email: String) // TODO Bean对象 => Json 字符串 (Json 序列化)
object Bean2Json extends App { val user: UserBean = UserBean("张飞", 21, new Date(), "hao123@163.com") val mapper: ObjectMapper = new ObjectMapper() // user 对象 转 json字符串
val beanJson: String = mapper.writeValueAsString(user) println(beanJson)
// {"name":"张飞","age":21,"birthday":1660115099317,"email":"hao123@163.com"} // scala 集合 转 json字符串
val list: Array[UserBean] = Array(
UserBean("刘备", 21, new Date(), "hao123@163.com"),
UserBean("关羽", 22, new Date(), "hao456@163.com"),
UserBean("张飞", 23, new Date(), "hao789@163.com")
) private val listJson: String = mapper.writeValueAsString(list) println(listJson)
// [{"name":"刘备","age":21,"birthday":1660115099712,"email":"hao123@163.com"},{"name":"关羽","age":22,"birthday":1660115099712,"email":"hao456@163.com"},{"name":"张飞","age":23,"birthday":1660115099712,"email":"hao789@163.com"}]
}

6. Json 字符串 => Bean对象 (Json 反序列化)

// TODO 由于 利用反射 对json串反序列化,所有必须有 空参构造 + get、set方法
class UserBean1() {
@BeanProperty var name: String = _
@BeanProperty var age: Int = _
@BeanProperty var birthday: Date = _
@BeanProperty var email: String = _ override def toString = s"UserBean1($name, $age, $birthday, $email)"
} // TODO Json 字符串 => Bean对象 (Json 反序列化)
object Json2Bean extends App {
val jsonBean: String =
"""
|{"name":"张飞","age":21,"birthday":1660115099317,"email":"hao123@163.com"}
""".stripMargin val jsonArray: String =
"""
|[{"name":"刘备","age":21,"birthday":1660115099712,"email":"hao123@163.com"},{"name":"关羽","age":22,"birthday":1660115099712,"email":"hao456@163.com"},{"name":"张飞","age":23,"birthday":1660115099712,"email":"hao789@163.com"}]
""".stripMargin val mapper: ObjectMapper = new ObjectMapper() // json 转 bean 对象
private val bean: UserBean1 = mapper.readValue(jsonBean, classOf[UserBean1]) // json 数组 转 bean 对象数组
private val array: Array[UserBean1] = mapper.readValue(jsonArray, classOf[Array[UserBean1]]) array.foreach(println(_)) println(bean)
}

7. 使用注解

class UserBean2() {
@JsonIgnore //进行JSON操作时忽略该属性
@BeanProperty var name: String = _ @BeanProperty var age: Int = _ @JsonFormat(pattern = "yyyy-MM-dd") // 格式化日期属性
@BeanProperty var birthday: Date = _ @JsonProperty("mail_Alias")
@BeanProperty var email: String = _ override def toString = s"UserBean2($name, $age, $birthday, $email)"
} // TODO 使用注解
object Bean2Json_Anno extends App { val user: UserBean2 = new UserBean2() user.setAge(21)
user.setName("张飞")
user.setBirthday(new Date())
user.setEmail("hao123@163.com") val mapper: ObjectMapper = new ObjectMapper() // user 对象 转 json字符串
val beanJson: String = mapper.writeValueAsString(user) println(beanJson)
// {"age":21,"birthday":"2022-08-10","mail_Alias":"hao123@163.com"} }

最新文章

  1. c#之结构体
  2. JS图片延迟加载分析及简单的demo
  3. MFC DialogBar 按钮灰色不响应
  4. C++ Primer的课后规划问题的第八章
  5. DSP连接不上CCS3.3的问题讨论
  6. Got Stucked in C++ Static Library Loading.. for some time
  7. SAP ABAP编程 Table Control动态隐藏列
  8. 51Nod 1196 字符串的数量
  9. 12 Django Rest Swagger生成api文档
  10. day11_单元测试_读取yaml文件中的用例,自动获取多个yaml文件内容执行生成报告
  11. vue-router源码分析
  12. Android Manifest文件
  13. 【shell】创建长目录,目录存在则忽略,缺失则创建
  14. HDU 1940
  15. vue 中使用 screenfull.js 全屏插件
  16. Express应用程序目录结构
  17. PHPExcel IE导出乱码问题
  18. opencv2.4.0版本不支持Mat的大小自动调整?
  19. 重新分析connection reset by peer, socket write error错误原因
  20. 【PTA 天梯赛训练】QQ帐户的申请与登陆(散列+set模拟)

热门文章

  1. python之三元表达式与生成式与匿名与内置函数(部分)
  2. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
  3. 开源项目 PM 浅谈如何设计官网
  4. 入坑KeePass(三)安全设置完后后留存
  5. 慢到不能忍?别忍了,Ubuntu 21.10 APT 源修改为华为云镜像源
  6. html关键字大全
  7. 如何获取GC(垃圾回收器)的STW(暂停)时间?
  8. 工具箱之 IKVM.NET 项目新进展
  9. NC224938 加减
  10. Tapdata 在线研讨会:实时数据同步应用场景及实现方案探讨