使用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)
}
答案 0 :(得分:1)
要使用json4创建自定义命名,您需要使用自定义格式。
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