Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
将键/值case类Scala转换为Json_Scala_Playframework_Play Json - Fatal编程技术网

将键/值case类Scala转换为Json

将键/值case类Scala转换为Json,scala,playframework,play-json,Scala,Playframework,Play Json,鉴于以下案例类别: case class ValueItem(key: String, value: String) 以及以下json格式化程序: implicit val valueItemFormat: Format[ValueItem] = ( (__ \ "key").format[String] and (__ \ "value").format[String])(ValueItem.apply, unlift(ValueItem.unapply))

鉴于以下案例类别:

case class ValueItem(key: String, value: String)
以及以下json格式化程序:

implicit val valueItemFormat: Format[ValueItem] = (
        (__ \ "key").format[String] and
        (__ \ "value").format[String])(ValueItem.apply, unlift(ValueItem.unapply))
ValueItem实例的json表示,如

ValueItem("fieldname", "fieldValue")

我想知道如何在平面键/值序列化中获得json,如

{ "fieldName" : "fieldValue" }

我想不出一种使用组合器的好方法,因为那里的大多数方法都需要一种更直接的方法来将路径上的值映射到case类字段

这里有一个解决方案,它适用于像
{“fieldName”:“fieldValue”}
这样的对象

正如您所看到的,我已经求助于手动定义
读取
写入
读取
是一个棘手的部分,因为我们不习惯将路径名拉入case类。我们可以
首先将对象验证为
JsObject
,然后
仅收集与我们要查找的确切结构匹配的对象(仅一个键值对,其中值为
JsString
)。
写入
要简单得多,因为
Json.obj
可以做我们想要的事情

在行动中:

scala> Json.parse(""" { "fieldName" : "fieldValue" } """).validate[ValueItem]
res0: play.api.libs.json.JsResult[ValueItem] = JsSuccess(ValueItem(fieldName,fieldValue),)

scala> val item = ValueItem("myKey", "myValue")
item: ValueItem = ValueItem(myKey,myValue)

scala> Json.toJson(item)
res2: play.api.libs.json.JsValue = {"myKey":"myValue"}

Play发布了独立于Play框架处理JSON的模块

写了一篇关于将JSON读入案例类的博文,但写的内容非常相似。查看

使用case类,并且(已经包含在Play框架中)使用简单的一行隐式语句在json和case类之间进行case转换

case class User(username: String, friends: Int, enemies: Int, isAlive: Boolean)

object User {
  implicit val userJsonFormat = Json.format[User]
}

我想您可能需要定义单独的读写操作,而不是使用这种格式。是的,这是一个很好的观点。我已经去过那里了,但是我遇到了一个问题,就是在没有参数名的情况下找到正确的jspath,但是知道它的位置。在“值”之前加上“键”之类的词,这确实很有帮助。谢谢
scala> Json.parse(""" { "fieldName" : "fieldValue" } """).validate[ValueItem]
res0: play.api.libs.json.JsResult[ValueItem] = JsSuccess(ValueItem(fieldName,fieldValue),)

scala> val item = ValueItem("myKey", "myValue")
item: ValueItem = ValueItem(myKey,myValue)

scala> Json.toJson(item)
res2: play.api.libs.json.JsValue = {"myKey":"myValue"}
case class User(username: String, friends: Int, enemies: Int, isAlive: Boolean)

object User {
  implicit val userJsonFormat = Json.format[User]
}