2014-01-18 2 views
3

Я работал, чтобы вернуть 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 }

для подчеркиваемых ключей

+2

версия Обновление до 3.2.11 и использования DefaultFormats.preservingEmptyValues ​​ –

ответ

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 
    // } 

} 
+0

Mhmm это не работает до сих пор. Возможно, это разница между методами родного и джексона. –

+0

Можете ли вы создать минимальный образец проекта? –

+0

Я буду, когда у меня будет время, однако, честно говоря, мы начали отходить от Скалатры, так что это уже не приоритет. Когда у меня будет шанс, я попытаюсь подтвердить, что это разница между реализациями, и при необходимости отправьте сообщение об ошибке. –

Смежные вопросы