【问题标题】:scala - how to change field names when decomposing with json4s?scala - 使用 json4s 分解时如何更改字段名称?
【发布时间】:2018-08-06 14:16:00
【问题描述】:

对于Json Play,当我想用​​自定义字段名称返回SalesData 的Json 表示时,我在Writes 的帮助下做到了,如下所示。是否可以使用Json4s 达到相同的结果?我从文档中读到By default the constructor parameter names must match json field names.

这是我使用 Play 框架的方法:

object SalesProcessor {
    case class SalesData(saleId: Int, saleType: String)
    implicit val saleReads: Reads[SalesData] = (
        (JsPath \ "saleId").read[Int] and
        (JsPath \ "saleType").read[String]
    ) (SalesData.apply _)

    implicit val saleWrites: Writes[SalesData] = (
       (JsPath \ "id").write[String] and
         (JsPath \ "type").write[String]
       ) (unlift(SalesData.unapply))

    val rawJson: String = Source.fromURL("https://mytest.com/api/sales.json").mkString
    val salesJson: JsValue = Json.parse(rawJson)
    val salesData: List[SalesData] = salesJson.as[List[SalesData]]

    def salesToJsValue(salesData: SalesData): JsValue = {
       Json.toJson(salesData)
     }
}

但是在分解的时候如何给不同的字段名呢?

def salesToJsValue(salesData: SalesData): JValue = {
           Extraction.decompose(salesData)
         }

【问题讨论】:

    标签: json scala json4s


    【解决方案1】:

    为了使用 json4s 创建自定义命名,您需要使用自定义格式。

    import org.json4s.{DefaultFormats, Extraction, FieldSerializer, Formats}
    import org.json4s.FieldSerializer._
    import org.json4s.native.Serialization.{read, write}
    
    val rename = FieldSerializer[SalesData](
      renameTo("saleId", "id").orElse(renameTo("saleType", "type"))
    )
    
    implicit val format: Formats = DefaultFormats + rename
    
    
    val result = Extraction.decompose(SalesData(1, "NEW"))
    

    https://github.com/json4s/json4s#serializing-fields-of-a-class

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 2021-07-28
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      相关资源
      最近更新 更多