JSON4S简明指南

Posted 达达的好奇心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON4S简明指南相关的知识,希望对你有一定的参考价值。

没有使用过JSON4S的同学请在终端下配合amm阅读本文。使用过JSON4S的同学可以快速浏览本文,收藏留作速查手册。

Ammonite 简明指南

 
   
   
 
  1. curl -L -o $HOME/bin/amm https://git.io/vHr1V && chmod +x $HOME/bin/amm

$HOME/bin/amm 可以启动 REPL,下文的代码均可以在 amm 上跑。如果要引入依赖,可以在 https://index.scala-lang.org 找。

我选择 Jackson

JSON String, JValue, Scala对象

JSON String -> JValue

 
   
   
 
  1. import $ivy.`org.json4s::json4s-jackson:3.5.2`

  2. import org.json4s.jackson.JsonMethods.parse

  3. // 正常的例子

  4. parse(""" { "numbers" : [1, 2, 3, 4] } """)

  5. // null

  6. parse(""" { "code": 0, "error": null } """)

JValue -> JSON String

 
   
   
 
  1. import $ivy.`org.json4s::json4s-jackson:3.5.2`

  2. import org.json4s.jackson.JsonMethods.render

  3. import org.json4s.jackson.JsonMethods.compact

  4. import org.json4s.jackson.JsonMethods.pretty

  5. import org.json4s.JsonDSL._

  6. // primitive type 会被隐式转换成 JValue,

  7. // 比如这里的 List(1, 2, 3) 就是 JArray(List(JInt(1), JInt(2), JInt(3)))

  8. compact(render(List(1, 2, 3)))

  9. // JValue

  10. val joe = ("name" -> "joe") ~ ("age" -> Some(35))

  11. pretty(render(joe))

JValue -> Scala对象

 
   
   
 
  1. import $ivy.`org.json4s::json4s-jackson:3.5.2`

  2. import org.json4s._

  3. import org.json4s.JsonDSL._

  4. implicit val formats = DefaultFormats

  5. case class Person(name: String, age: Option[Int])

  6. val joe = ("name" -> "joe") ~ ("age" -> Some(35))

  7. joe.extract[Person]

Scala对象 -> JValue

 
   
   
 
  1. import $ivy.`org.json4s::json4s-jackson:3.5.2`

  2. import org.json4s.Extraction

  3. implicit val formats = DefaultFormats

  4. case class Person(name: String, age: Option[Int])

  5. Extraction.decompose(Person("joe", Some(11)))

序列化

 
   
   
 
  1. import $ivy.`org.json4s::json4s-jackson:3.5.2`

  2. import org.json4s._

  3. import org.json4s.jackson.Serialization

  4. import org.json4s.jackson.Serialization.{read, write}

  5. implicit val formats = Serialization.formats(NoTypeHints)

  6. case class Person(firstName: String)

  7. write(Person("joe"))

  8. read[Person](""" {"firstName": "joe"} """)

  9. case class Status(code: Int, error: String)

  10. read[Status](""" {"code": 0, "error": null} """)

Option 和 Either

  • Option可以用来表示可有可无的字段。Option是合理的。

  • Either可以用来表示恶心的需求。使用了Either说明API定义不规范。

Play with JValue

Snakize and Camelize

 
   
   
 
  1. import $ivy.`org.json4s::json4s-jackson:3.5.2`

  2. import org.json4s.JsonDSL._

  3. val camelJoe = ("firstName" -> "joe") ~ ("age" -> 23)

  4. camelJoe.snakizeKeys

  5. val snakeJoe = ("first_name" -> "joe") ~ ("age" -> 23)

  6. snakeJoe.camelizeKeys

在序列化和反序列化的过程中,如果字段名的风格不一致,就需要通过JValue这种中间状态转换字段名的风格。

XPath

如果只需要JSON中的部分字段,那么就用XPath和Pattern Matching,如果所有的字段都需要用到,那就用extract to case class的方式。

而for-comprehension的可读性比较差,不推荐使用。在这种场景下,for-comprehension的语义被复杂化了,个人觉得是易用性上的缺陷。如果你要用for-comprehension,你必须清楚地知道整个ast的结构,知道每个 <-的不同含义。


以上是关于JSON4S简明指南的主要内容,如果未能解决你的问题,请参考以下文章

wfb-ng 开源工程结构&代码框架简明介绍

git - 简明指南

markdown golang / dep的简明指南

Golang的简明安装指南

有趣的机器学习:最简明入门指南

简明conda使用指南