首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止json4s呈现空值?

如何防止json4s呈现空值?
EN

Stack Overflow用户
提问于 2015-10-23 08:27:10
回答 2查看 2.4K关注 0票数 2

当将object/JObject转换为json字符串时,如何防止json4s呈现空值?

在杰克逊,你可以这样做:

代码语言:javascript
复制
mapper.setSerializationInclusion(Include.NON_NULL)

我如何在json4s中做同样的事情呢?

示例

代码语言:javascript
复制
import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.Serialization
import org.json4s.{Extraction, NoTypeHints}

case class Book(title: String, author: String)

implicit val formats = Serialization.formats(NoTypeHints)

val bookJValue = Extraction.decompose(Book(null, "Arthur C. Clark"))
# JObject(List((title,JNull), (author,JString(Arthur C. Clark))))

val compacted = compact(render(bookJValue))
# {"title":null,"author":"Arthur C. Clark"}

我想要压缩的json是这样的:

代码语言:javascript
复制
{"author":"Arthur C. Clark"}
EN

回答 2

Stack Overflow用户

发布于 2015-10-23 09:18:51

代码语言:javascript
复制
case class Book(title: Option[String], author: String)
val b = Book(None, "Arthur C. Clark")
println(write(b))
res1:> {"author":"Arthur C. Clark"}

您可以使用Option定义变量。如果为none,则不会序列化该变量。

还有一种方法可以通过在您的removeField之后使用decompose来实现这一点,比如:

代码语言:javascript
复制
bookJValue.removeFile {
   case (_, JNull) => true
   case _ => false
}
票数 4
EN

Stack Overflow用户

发布于 2015-10-23 15:36:55

您可以轻松地创建您自己的自定义序列化程序。跟我来。

首先,在formats中做一些小的改变

代码语言:javascript
复制
implicit val formats = DefaultFormats + new BookSerializer

之后,构建您自己的序列化程序/反序列化程序:

代码语言:javascript
复制
class BookSerializer extends CustomSerializer[Book](format => (
  {
    case JObject(JField("title", JString(t)) :: JField("author", JString(a)) ::Nil) =>
      new Book(t, a)
  },
  {
    case x @ Book(t: String, a: String) =>
      JObject(JField("title", JString(t)) ::
        JField("author", JString(a)) :: Nil)
    case Book(null, a: String) =>
      JObject(JField("author", JString(a)) :: Nil) // `title` == null
  }
  ))

第一部分是反序列化器(将数据从json转换到case类),第二部分是序列化器(从case类到json的转换)。我增加了title == null的案例。您可以随心所欲地添加更多的案例。

整份清单:

代码语言:javascript
复制
import org.json4s.jackson.JsonMethods._
import org.json4s.{DefaultFormats, Extraction}
import org.json4s._


case class Book(title: String, author: String)

implicit val formats = DefaultFormats + new BookSerializer
class BookSerializer extends CustomSerializer[Book](format => (
  {
    case JObject(JField("title", JString(t)) :: JField("author", JString(a)) ::Nil) =>
      new Book(t, a)
  },
  {
    case x @ Book(t: String, a: String) =>
      JObject(JField("title", JString(t)) ::
        JField("author",   JString(a)) :: Nil)
    case Book(null, a: String) =>
      JObject(JField("author",   JString(a)) :: Nil) // `title` == null
  }
  ))

val bookJValue = Extraction.decompose(Book(null, "Arthur C. Clark"))
val compacted = compact(render(bookJValue))

输出:

代码语言:javascript
复制
compacted: String = {"author":"Arthur C. Clark"}

您可以在json4s项目的页面上找到其他信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33297913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档