3

我一直在努力使用文档中描述的隐式转换从 Scalatra 应用程序返回 JSON 。

我注意到带有空选项(即无)的键会从生成的 JSON 中删除(而不是为空,这似乎是预期的行为)

我试图使用隐式转换来强制转换为Nonenull例如:

class NoneJNullSerializer extends CustomSerializer[Option[_]](format => (
  {
    case JNull => None
  }, {
    case None => JNull
  }
  ))

protected implicit val jsonFormats: Formats = DefaultFormats.withBigDecimal + new NoneJNullSerializer()

但是,在执行自定义序列化程序之前,这些键似乎已被剥离。

有没有人找到解决方案?

请注意,此问题中描述的解决方案适用于所描述的数组情况,但似乎不适用于 Maps。

更新: 这是我一直在使用的测试:

  get("/testJSON") {
    Map(
      "test_key" -> "testValue" ,

      "test_key6" -> "testValue6" ,
      "subObject" -> Map(
        "testNested1" -> "1" ,
        "testNested2" -> 2 ,
        "testArray" -> Seq(1, 2, 3, 4)
      ),
    "testNone" -> None ,
    "testNull" -> null ,
    "testSomeNull" -> Some(null) ,
    "testJNull" -> JNull ,
    "testSomeJNull" -> Some(JNull)
    )
  }

我正在寻找的输出是

{
    "test_key": "testValue",
    "test_some_j_null": null,
    "sub_object": {
        "test_nested1": "1",
        "test_nested2": 2,
        "test_array": [
            1,
            2,
            3,
            4
        ]
    },
    "test_none": null,
    "test_j_null": null,
    "test_key6": "testValue6",
    "test_null": null,
    "test_some_null": null
}

我也在使用

protected override def transformResponseBody(body: JValue): JValue = { body.underscoreKeys }

对于带下划线的键

4

1 回答 1

0

使用自定义序列化程序也应该适用于地图。

import org.json4s._
import org.json4s.jackson.JsonMethods._

object testNull extends App {

  val data = Map(
    "testNone" -> None,
    "testNull" -> null,
    "testSomeNull" -> Some(null),
    "testJNull" -> JNull,
    "testSomeJNull" -> Some(JNull)
  )

  class NoneJNullSerializer extends CustomSerializer[Option[_]](format => ( {
    case JNull => None
  }, {
    case None => JNull
  }))

  implicit val formats = DefaultFormats + new NoneJNullSerializer

  val ast = Extraction.decompose(data)

  println(pretty(ast))

  //  {
  //    "testSomeJNull" : null,
  //    "testJNull" : null,
  //    "testNone" : null,
  //    "testNull" : null,
  //    "testSomeNull" : null
  //  }

}
于 2014-01-31T12:55:13.533 回答