Akka:如何创建一个没有空值的紧凑型json?

时间:2016-08-19 11:56:40

标签: scala akka spray-json

是否可以使用Akka(可能是一些Spray" utils"?)从这样的case class开始构建一个紧凑的json feed:

case class Stuff (val1: String, val2: String, val3: String)

以这种方式构建:

Stuff("one value", "", "another value")

以紧凑的形式获取一个json,它将跳过"空值"并将返回:

{"val1" : "one value", "val3" : "another value"}

2 个答案:

答案 0 :(得分:2)

我有一个更简单但需要您使用case class构建Option

import spray.json._

case class Something(name: String, mid: Option[String], surname: String)

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val sthFormat = jsonFormat3(Something)
}

object Main {
  def main(args: Array[String]): Unit = {

    val sth = Something("john", None, "johnson").toJson
    println(sth) // yields {"name":"john","surname":"johnson"}

  }
}

kali对自定义编写者的回答可能会更好,具体取决于您的需求。

答案 1 :(得分:1)

你可以定义在json序列化期间可能发生的事情,如果你有一些其他的“东西”你可以定义这个隐含的特性用于重用

import org.json4s.jackson.Serialization._
import org.json4s.{FieldSerializer, NoTypeHints}
import org.json4s.jackson.Serialization

trait EmptySpaceIgnoredJsonable {
    def toJsonWithEmptyThingies : String = {
        implicit val formats = Serialization.formats( NoTypeHints ) +
            FieldSerializer[ this.type ]( doStuffWhileSerializing() )
        write( this )
    }

    def doStuffWhileSerializing() : PartialFunction[ (String, Any), Option[ (String, Any) ] ] = {
        case (x, y : String) if !y.isEmpty => Some( x , y )
        case _ => None
    }
}

// then use it, when ever you require empty "stuff"
case class Stuff (val1: String, val2: String, val3: String) extends EmptySpaceIgnoredJsonable
val stuff = Stuff("one value", "", "another value")
println(stuff.toJsonWithEmptyThingies)