【问题标题】:How to create a JSON object in Scala?如何在 Scala 中创建 JSON 对象?
【发布时间】:2016-01-23 06:54:36
【问题描述】:

首先,我在 Google 和 StackOverflow 上搜索了很多类似的问题,但没有找到任何有用的答案(令我大吃一惊)。

我看到了一些关于Play Frameworkhow to create JSON array in Javahow to create JSON objects in Java 的东西,但我不想使用 Play Framework,而且我不知道 JSON 对象的创建是否从 Scala 到 Java 不同。

以下是我要创建的 JSON。稍后我会将对象转换为字符串以通过 POST 请求(通过 API 调用)发送。

{
    "start_relative": {
        "value": "5",
        "unit": "years"
    },
    "metrics": [
        {
        "name": "DP_391366" # S-Temperature - Celsius
        },
        {
            "name": "DP_812682" # Sensor-A4 Luminosity
        }
    ]
}

如何在 Scala 中做类似的事情?

【问题讨论】:

  • 不清楚你在问什么。您是否正在尝试从 Scala 类转换为 JSON 字符串?您可以发布您尝试转换的 scala 类/pobject 吗?
  • 不,我不想将 Scala 类转换为 JSON 字符串。我想从 Scala 创建一个有效的 JSON。
  • “来自 Scala”是什么意思?
  • @FernandoPaladini 您所说的称为序列化,它涉及采用数据结构(对象)并以编程方式将其转换为 JSON 字符串。您可以手动完成,但使用现有库会比您更快地完成它要容易得多。

标签: json scala


【解决方案1】:

如果你不想自己做,你需要使用一个库,有几个:

注意:如果你想在 Scala 中使用酷炫的 Java Gson 库,它会失去很多魔法,因为他们不知道集合。所以如果你想使用这个库,你必须将“Scala List”转换为 java.util.List,然后使用 Gson。

【讨论】:

【解决方案2】:

您应该使用处理序列化/反序列化的库。 我会考虑在Spray JsonPlay Json 之间进行选择。

我将首先向您解释该过程如何与Play一起工作,它与Spray中的非常相似。

假设你有一个类,一个带有实例和 json 作为字符串的对象:

case class MyClass(id: Int,
                   name: String,
                   description: String)

object Data {
  val obj: MyClass = MyClass(1, "me", "awesome")
  val str: String =
      """
        |{
        | "id": 1,
        | "name": "me",
        | "description": "awesome"
        |}
      """.stripMargin
}

对于要序列化/反序列化的MyClass,您将需要一个隐式格式化程序,专门用于此,因此您将使用Play创建一个包含此格式化程序的对象。

trait MyClassPlayProtocol {
  implicit val formatAbility = Json.format[Ability]
}
object MyClassPlayProtocol extends MyClassPlayProtocol

序列化/反序列化将如下所示:

object PlayData {

  import play.api.libs.json.JsValue
  import play.api.libs.json.Json
  import MyClassPlayProtocol._
  import General._

  val str2Json: JsValue = Json.parse(str)
  val obj2Json: JsValue = Json.toJson(obj)

  val json2Str: String = Json.stringify(str2Json)
  val json2Obj: MyClass = obj2Json.as[MyClass]
}

Spray中,协议如下所示:

trait MyClassSprayProtocol extends DefaultJsonProtocol {
  implicit val myClassFormat = jsonFormat3(MyClass)
}
object MyClassSprayProtocol extends MyClassSprayProtocol

以及序列化/反序列化:

object SprayData {

  import spray.json._
  import MyClassSprayProtocol._
  import General._

  val str2Json: JsValue = str.parseJson
  val obj2Json: JsValue = obj.toJson

  val json2Str: String = str2Json.compactPrint
  val json2Obj: MyClass = obj2Json.convertTo[MyClass]
}

如您所见,这主要是两者之间的选择问题。两者都还在改进中,可能会在不久的将来。

根据基准,您会发现一个比另一个好几毫秒(通常是 Spray)。

我在工作中使用Spray,在一些个人项目中使用Play,我不能说我发现了一些根本不同的东西。 p>

编辑:

最后回答你的问题,从MyClassString(序列化),你会做这样的事情:

PLAY:  Json.stringify(Json.toJson(myClass))
SPRAY: myClass.toJson.compactPrint

以及反序列化:

PLAY:  Json.parse(string).as[MyClass]
SPRAY: myClass.parseJson.convertTo[MyClass]

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2017-05-23
    • 2011-03-17
    • 2021-01-01
    相关资源
    最近更新 更多