【问题标题】:Gson-like library for scala用于 scala 的类 Gson 库
【发布时间】:2016-04-25 20:14:06
【问题描述】:

我正在学习 scala。我正在尝试找到一种将 JSON 字符串转换为 Scala 案例类实例的简单方法。 Java 有一个很棒的库,叫做 Google Gson。无需特殊编码即可将java bean转为json再转回,基本上一行代码就可以搞定。

public class Example{
  private String firstField
  private Integer secondIntField

  //constructor

  //getters/setters here
}
//Bean instance to Json string
String exampleAsJson = new Gson().toJson(new Example("hehe", 42))

//String to Bean instance
Example exampleFromJson = new Gson().fromJson(exampleAsJson, Example.class)

我正在阅读有关 https://www.playframework.com/documentation/2.5.x/ScalaJson 的信息,但不明白:为什么 scala 如此复杂?为什么我应该编写阅读器/编写器来序列化/反序列化简单的案例类实例?有没有简单的方法可以使用 play json api 转换案例类实例 -> json -> 案例类实例?

【问题讨论】:

  • jackson 有一个DefaultScalaModule,它适用于所有标准集合和案例类...

标签: java json scala playframework-2.5


【解决方案1】:

假设你有

case class Foo(a: String, b: String)

您可以轻松地在 Play 中为此编写 formatter

implicit val fooFormat = Json.format[Foo]

这将允许您序列化和反序列化为 JSON。

val foo = Foo("1","2")
val js = Json.toJson(foo)(fooFormat)  // Only include the specific format if it's not in scope.
val fooBack = js.as[Foo]              // Now you have foo back!

【讨论】:

  • Gson 会将任何案例类转换为通用代码中的 Json。以上要求您为每个案例类编写一个格式化程序(例如,我有 124 个模型),并且不适用于不知道是否有第 125 个的通用代码。葛森万岁。只需将libraryDependencies += "com.google.code.gson" % "gson" % "2.8.0" 添加到 build.sbt。
  • 如果您使用的是 Play 框架,如果您尝试在没有为其定义 writes 实例的控制器中发送 JsValue,则代码将无法编译。 GSON 都是运行时的,也不知道原生 Scala 类型(Option、scala.collection.immutable.Map 等),这需要您为这些类型手动编写序列化程序。
【解决方案2】:

查看uPickle

这是一个小例子:

case class Example(firstField: String, secondIntField: Int)

val ex = Example("Hello", 3)

write(ex) // { "firstField": "Hello", "secondIntField" : 3 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2017-04-25
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多