json4s 简明指南

栏目: 后端 · 前端 · 发布时间: 7年前

内容简介:json4s 简明指南

json4s 简明指南

Ammonite 简明指南

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

import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s.jackson.JsonMethods.parse
// 正常的例子
parse(""" { "numbers" : [1, 2, 3, 4] } """)
// null
parse(""" { "code": 0, "error": null } """)

JValue & Scala对象 -> JSON String

import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s.jackson.JsonMethods.render
import org.json4s.jackson.JsonMethods.compact
import org.json4s.jackson.JsonMethods.pretty
import org.json4s.JsonDSL._

// primitive type 会被隐式转换成 JValue,比如这里的 List(1, 2, 3) 就是 JArray(List(JInt(1), JInt(2), JInt(3)))
compact(render(List(1, 2, 3)))

// JValue
val joe = ("name" -> "joe") ~ ("age" -> Some(35))
pretty(render(joe))

JValue -> Scala对象

import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s._
import org.json4s.JsonDSL._

implicit val formats = DefaultFormats

case class Person(name: String, age: Option[Int])
val joe = ("name" -> "joe") ~ ("age" -> Some(35))
joe.extract[Person]

Scala对象 -> JValue

import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s.Extraction
implicit val formats = DefaultFormats

case class Person(name: String, age: Option[Int])
Extraction.decompose(Person("joe", Some(11)))

序列化

import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s._
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.{read, write}
implicit val formats = Serialization.formats(NoTypeHints)

case class Person(firstName: String)
write(Person("joe"))

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

case class Status(code: Int, error: String)
read[Status](""" {"code": 0, "error": null} """)

Option 和 Either

  • Option可以用来表示可有可无的字段。Option是合理的。
  • Either可以用来表示恶心的需求。使用了Either说明api定义不规范。

Play with JValue

Snakize and Camelize

import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s.JsonDSL._

val camelJoe = ("firstName" -> "joe") ~ ("age" -> 23)
camelJoe.snakizeKeys
val snakeJoe = ("first_name" -> "joe") ~ ("age" -> 23)
snakeJoe.camelizeKeys

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

XPath

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

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

爆裂

爆裂

[美] 伊藤穰一、[美] 杰夫·豪 / 张培、吴建英、周卓斌 / 中信出版集团 / 2017-9-1 / 65.00元

越是在发生重大改变的时刻,越是会出现两极分化,赢家、输家有时只在一念间。未来已经装上了全新的操作系统。这是一个重大升级,对我们而言,随之而来的则是陡峭的学习曲线。在指数时代,替换旧逻辑,我们的思维亟需与世界对接,推翻过去已经成为大众所接受的常识,学会差异化思考才能屹立不倒,不被卷入历史的洪流。 在《爆裂》一书中,伊藤穰一和杰夫·豪将这一逻辑提炼为9大原则,帮助人们驾驭这一动荡时刻,应对当下的......一起来看看 《爆裂》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具