scala - 使用 json4s 分解时如何更改字段名称?
scala - how to change field names when decomposing with json4s?
With Json Play
当我想 return Json 表示 SalesData
和自定义字段名称时,我是在 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)
}
为了使用 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
With Json Play
当我想 return Json 表示 SalesData
和自定义字段名称时,我是在 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)
}
为了使用 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