Scala:如何有选择地将对象的字段写入 json 字符串?
Scala: how to selectively write fields of an object to json string?
我有一个查询对象:
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)
在 Lift-Json 中,可选值没有被序列化。因此,如果您将大小写 class 更改为 case class SearchQuery(keyword: String, count: Int, sort: Option[String])
,您应该得到您想要的行为。
参见
中的 "Any value can be optional"
https://github.com/lift/lift/tree/master/framework/lift-base/lift-json
您可以将您的排序字段设为可选,因为 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}
我有一个查询对象:
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)
在 Lift-Json 中,可选值没有被序列化。因此,如果您将大小写 class 更改为 case class SearchQuery(keyword: String, count: Int, sort: Option[String])
,您应该得到您想要的行为。
参见
中的 "Any value can be optional"https://github.com/lift/lift/tree/master/framework/lift-base/lift-json
您可以将您的排序字段设为可选,因为 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}