Scala键/值案例类到Json

时间:2015-05-09 05:51:53

标签: 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))

这样的ValueItem实例的json表示
ValueItem("fieldname", "fieldValue")

{ "key" : "fieldName" , "value" : "fieldValue" }

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

{ "fieldName" : "fieldValue" }

2 个答案:

答案 0 :(得分:1)

我无法想到使用组合器这样做的好方法,因为大多数方法都需要更直接的方法来映射到案例类字段的路径上的值。

这是一个适用于{"fieldName" : "fieldValue"}等对象的解决方案。

import play.api.libs.json._
import play.api.data.validation.ValidationError

implicit val fmt: Format[ValueItem] = new Format[ValueItem] {

    def reads(js: JsValue): JsResult[ValueItem] = {
        js.validate[JsObject].collect(ValidationError("Not a key-value pair")) {
            case JsObject(Seq((key, str: JsString))) => ValueItem(key, str.value)
        }
    }

    def writes(v: ValueItem): JsValue = Json.obj(v.key -> v.value)

}

我已经手动定义了readswrites,如您所见。 Reads是棘手的部分,因为我们不习惯将路径名称拉入案例类。我们可以先validate将对象JsObject作为collect,然后JsString只匹配我们正在寻找的确切结构的对象(只有一个键值对,其值为一个Writes)。 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"} 可以完全按照我们的意愿行事。

行动中:

createButtonOne() {
    ... 
    public boolean pressed() {
        doSomething();
        return true;
    }
}

createButtonTwo() {
    ...
    public boolean pressed() {
        doAnotherThing();
        return true;
    }
}

答案 1 :(得分:0)

Play发布了用于处理独立于Play Framework的JSON的模块,Play WS

撰写一篇关于将JSON读取到案例类的博客文章,但是写的非常相似。请在http://pedrorijo.com/blog/scala-json/

查看

使用案例类和Play WS(已包含在Play框架中),您可以在json和case类之间进行转换,并使用简单的单行隐式

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

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