Scala:如何有选择地将对象的字段写入json字符串?

时间:2017-04-03 17:01:41

标签: scala lift-json

我有一个查询对象:

case class SearchQuery(keyword: String, count: Int, sort: String)

我将此对象序列化以将其发送到restful api以获取搜索响应。 是否有可能在基于某些条件进行序列化时不写一些属性,如果sort为空我希望json字符串为"{keyword: 'whatever', count: 25}",如果sort非空,那么我希望它是"{keyword: 'whatever', count: 25, sort: 'unitPrice'}"。实现这一目标的最佳方法是什么?

我正在使用lift json进行序列化。

非常感谢任何帮助。谢谢。

更新

val reqHeaders: scala.collection.immutable.Seq[HttpHeader] = scala.collection.immutable.Seq(
      RawHeader("accept", "application/json"),
      RawHeader("authorization", "sgdg545wf34rergt34tg"),
      RawHeader("content-type", "application/json"),
      RawHeader("x-customer-id", "45645"),
      RawHeader("x-locale-currency", "usd"),
      RawHeader("x-locale-language", "en"),
      RawHeader("x-locale-shiptocountry", "US"),
      RawHeader("x-locale-site", "us"),
      RawHeader("x-partner-id", "45sfg45fgd5")
    )

implicit val formats = DefaultFormats
val searchObject = net.liftweb.json.Serialization.write(req) //req is search object
val searchObjectEntity = HttpEntity(ContentTypes.`application/json`, searchObject)
val request = HttpRequest(HttpMethods.POST, "https://api.xxxxxxx.com/services/xxxxxxxx/v1/search?client_id=654685", reqHeaders, searchObjectEntity)

2 个答案:

答案 0 :(得分:1)

在Lift-Json中,可选值未序列化。因此,如果您将案例类更改为case class SearchQuery(keyword: String, count: Int, sort: Option[String]),则应该只获得所需的行为。

请参阅

中的“任何值可选”

https://github.com/lift/lift/tree/master/framework/lift-base/lift-json

答案 1 :(得分:0)

您可以使您的排序字段可选,因为scala为您提供了一种处理可选字段的方法,然后使用Lift Json或Jerkson Json进行序列化。

以下是Jerkson Json的示例代码。

case class SearchQuery(keyword: String, count: Int, sort: Option[String])
com.codahale.jerkson.Json.generate(SearchQuery("keyword",1,None))

这将为您提供输出 - >

{"keyword":"keyword","count":1}