我正在开发一个小项目,尝试让Scala / Play后端正常工作。我试图让它返回并在Web服务端处理JSON。我似乎无法弄清楚如何让JSON编组和解组工作。有人可以帮我解决这个问题吗?我正在使用Play 2.1和Scala 2.10。我得到的错误是 “重写方法读取特征读取类型(json:play.api.libs.json.JsValue)play.api.libs.json.JsResult [models.Address];方法读取具有不兼容的类型”
编辑。别人给了我解决方案。对于读取,您必须使用JsSuccess,而不是JsResult。
case class Address(id: Long, name: String)
object Address {
implicit object AddressFormat extends Format[Address] {
def reads(json: JsValue):Address = JsSuccess(Address(
(json \ "id").as[Long],
(json \ "name").as[String]
))
def writes(address: Address): JsValue = JsObject(Seq(
"id" -> JsNumber(address.id),
"name" -> JsString(address.name)
))
}
}
答案 0 :(得分:3)
使用Play 2.1,您可以简化代码:
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit val addressFormat = (
(__ \ "id").format[String] and
(__ \ "name").format[Long]
)(Address.apply, unlift(Address.unapply))
可在此处找到更详细的信息:ScalaJsonCombinators
答案 1 :(得分:2)
您可以使用宏进一步简化代码,尽管它们被标记为实验性的:
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class Address(id: Long, name: String)
implicit val addressFormat = Json.format[Address]
官方Play文档中的
答案 2 :(得分:0)
嘿,我的解决方案是:
import play.api.libs.json.JsonNaming.SnakeCase
import play.api.libs.json._
object Test {
implicit val config = JsonConfiguration(SnakeCase)
implicit val userFormat: OFormat[Test] = Json.format[Test]
}
case class Test(
testName: String,
testWert: String,
testHaus: String
)
总之,你会得到一个补偿对象。配置将案例类的所有键转换为snakecase。隐式值确保可以将有效的Json解析为模型。所以你得到了你的测试模型。
Json应该是这样的:
{
"test_name" : "Hello",
"test_wert": "Hello",
"test_haus": "Hello"
}
https://www.playframework.com/documentation/2.6.x/ScalaJsonAutomated