当前位置: 首页 > 面试题库 >

Json4s在序列化期间忽略None字段(而不是使用'null')

单于正业
2023-03-14
问题内容

我有一个使用的通用json序列化方法json4s。不幸的是,如果值为,它将忽略字段None。我的目标是Nonenull值表示字段。我尝试通过为None添加自定义序列化程序,但仍然无法正常工作。

object test extends App {
          class NoneSerializer extends CustomSerializer[Option[_]](format => (
            {     
              case JNull => None
            },
            {
              case None => JNull

            }))

         implicit val f = DefaultFormats + new NoneSerializer

          case class JsonTest(x: String, y: Option[String], z: Option[Int], a: Option[Double], b: Option[Boolean], c:Option[Date], d: Option[Any])

          val v = JsonTest("test", None, None,None,None,None,None); 
println(Serialization.write(v))
}

以上代码的结果:

{"x":"test"}

问题答案:

我假设您想将Nones序列化到nullJSON中。在这种情况下,使用DefaultFormats.preservingEmptyValues

import java.util.Date
import org.json4s._
import org.json4s.jackson.Serialization

object test extends App {

  implicit val f = DefaultFormats.preservingEmptyValues // requires version>=3.2.11

  case class JsonTest(x: String, y: Option[String], z: Option[Int], a: Option[Double], b: Option[Boolean], c:Option[Date], d: Option[Any])

  val v = JsonTest("test", None, None, None, None, None, None);

  // prints {"x":"test","y":null,"z":null,"a":null,"b":null,"c":null,"d":null}
  println(Serialization.write(v))
}


 类似资料:
  • 我读过@JsonInclude这样的问题来忽略空值。这适用于实体中的常规字段,但不适用于集合。如果实体中的集合为空,Json序列化会给出一个空值。 如何对集合进行等效忽略?

  • 在我们的项目(springMVC)Rest API项目中,我希望只对请求和响应使用一个模型(以避免添加大量代码将字段从一个对象复制到另一个对象) 我想用昂首阔步来处理所有的医生,但我遇到了一个小问题。例如,假设我有一个模型用户 和一个简单的控制器 现在,我希望swagger在反序列化时隐藏属性密码,而不是序列化(因此,在输入时显示它,但在输出时显示它),在Id字段中则相反。 我尝试使用@jsoni

  • 问题内容: 如果该字段的值为null,如何配置Jackson在序列化期间忽略该字段的值。 例如: 问题答案: 要使用抑制具有空值的序列化属性,可以直接配置或使用批注: 要么: 或者,你可以在中使用,以便在值不为时显示属性。

  • 问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。

  • 我有这样的Jackson注释类: 假设我不能更改我的类代码。那么,如何让ObjectMapper只覆盖field2的JsonIgnore并将其序列化为json?但我希望它忽略field4。这很简单,只需要几行代码吗? 我的常规序列化代码: