Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中创建JSON对象?_Json_Scala - Fatal编程技术网

如何在Scala中创建JSON对象?

如何在Scala中创建JSON对象?,json,scala,Json,Scala,首先,我在Google和StackOverflow上搜索了很多类似的问题,但我没有找到任何有用的答案(令我大为惊讶) 我看到了一些关于和的内容,但我不想使用Play Framework,也不知道JSON对象的创建在Scala和Java之间是否有所不同 下面是我想要创建的JSON。稍后,我将把对象转换成字符串,通过POST请求(通过API调用)发送它 在Scala我怎么能做这样的事 如果您不想自己使用库,则需要使用库。有以下几种: 喷射Json- 提升Json- 杰克森- Jackson-您可以

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

我看到了一些关于和的内容,但我不想使用Play Framework,也不知道JSON对象的创建在Scala和Java之间是否有所不同

下面是我想要创建的JSON。稍后,我将把对象转换成字符串,通过POST请求(通过API调用)发送它


在Scala我怎么能做这样的事

如果您不想自己使用库,则需要使用库。有以下几种:

  • 喷射Json-
  • 提升Json-
  • 杰克森-
  • Jackson-您可以将Jackson与scala模块一起使用

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

您应该使用一个处理序列化/反序列化的库。 我会考虑在./P>之间进行选择。 首先,我将向您解释使用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]
}
trait MyClassSprayProtocol extends DefaultJsonProtocol {
  implicit val myClassFormat = jsonFormat3(MyClass)
}
object MyClassSprayProtocol extends MyClassSprayProtocol
PLAY:  Json.stringify(Json.toJson(myClass))
SPRAY: myClass.toJson.compactPrint
在喷洒中,协议如下所示:

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]
}
trait MyClassSprayProtocol extends DefaultJsonProtocol {
  implicit val myClassFormat = jsonFormat3(MyClass)
}
object MyClassSprayProtocol extends MyClassSprayProtocol
PLAY:  Json.stringify(Json.toJson(myClass))
SPRAY: myClass.toJson.compactPrint
以及序列化/反序列化:

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]
}
PLAY:  Json.parse(string).as[MyClass]
SPRAY: myClass.parseJson.convertTo[MyClass]
正如你所看到的,这主要是两者之间的选择问题。这两项技术仍在改进中,而且在不久的将来可能会有所改进

根据基准测试,您会发现其中一个比另一个好几毫秒(通常是喷雾)

例如,我在工作中使用了喷雾,在一些个人项目中使用了游戏,我不能说我发现了一些根本不同的东西

编辑:

最后要回答您的问题,从
MyClass
String
(序列化),您将执行以下操作:

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]
}
trait MyClassSprayProtocol extends DefaultJsonProtocol {
  implicit val myClassFormat = jsonFormat3(MyClass)
}
object MyClassSprayProtocol extends MyClassSprayProtocol
PLAY:  Json.stringify(Json.toJson(myClass))
SPRAY: myClass.toJson.compactPrint
以及反序列化:

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]
}
PLAY:  Json.parse(string).as[MyClass]
SPRAY: myClass.parseJson.convertTo[MyClass]

不清楚你在问什么。您是否正在尝试从Scala类转换为JSON字符串?您可以发布您试图转换的scala类/对象吗?不,我不想将scala类转换为JSON字符串。我想从Scala创建一个有效的JSON。“从Scala”是什么意思?@FernandoPaladini您所说的是序列化,它涉及以编程方式获取数据结构(对象)并将其转换为JSON字符串。您可以手动执行此操作,但使用现有的库要容易得多,而且速度比您快得多。