Я работал, чтобы вернуть JSON из приложения Scalatra, используя неявные преобразования, описанные в the docs.json4s удаление ключей со значением Нет
Я заметил, что ключи с пустыми параметрами (например, None) удаляется из полученного JSON (в отличие от признания ничтожным, что кажется, что ожидаемое поведение)
Я попытался использовать неявные преобразования для отливать None
к null
, как:
class NoneJNullSerializer extends CustomSerializer[Option[_]](format => (
{
case JNull => None
}, {
case None => JNull
}
))
protected implicit val jsonFormats: Formats = DefaultFormats.withBigDecimal + new NoneJNullSerializer()
однако ключи, кажется, раздели до выполнения пользовательских сериализаторов.
Кто-нибудь нашел решение этой проблемы?
Обратите внимание, что решение, описанное в this question, работает в описанном случае массивов, однако, похоже, не работает с Картами.
UPDATE: Это испытание я использую:
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 }
для подчеркиваемых ключей
версия Обновление до 3.2.11 и использования DefaultFormats.preservingEmptyValues –