[英]Load a list of objects to and from JSON that includes a Map
我有一些類似的對象:
class Car(val id: Int, val name: String)
然后,我將在列表中收集汽車
List[Car]();
我希望能夠將List [Car]轉換為JSON字符串,然后再從JSON字符串中加載它。
附帶說明一下,這個轉換過程有多不穩定,比如說我向User對象添加了另一個屬性? (注意:我不想要一個解決此問題的答案,只是想知道添加一個項目是否會破壞它)
更新資料
如何正確處理地圖,例如:Map [Int,Long]
假設我的模型已更新,其中包含地圖 :
class Car(val id: Int, val name: String, val options: Map[Int, Long])
使用play的json創建隱式的Writes,例如:
implicit val carWrites = new Writes[Car] {
def writes(c: Car) = Json.obj{
"id" -> c.id
"name" -> c.name
//"options" -> t.options
}
}
目前,我看到一個錯誤:找不到Map [Int,Long]類型的Json序列化器
您是否正在使用任何現有工具包來執行此操作? 我有Spray-Json的經驗。 您不必使用整個Spray工具包,而可以單獨使用Spray-Json。 您的編組將很簡單。
object UserJsonProtocol extends DefaultJsonProtocol {
implicit val userFormat = jsonFormat3(User)
}
import UserJsonProtocol._
val jsonFromList = listUsers.toJson
val usersFromJsonString = usersString.parseJson.convertTo[List[User]]
將字段添加到User類僅需要將jsonFormat更新為正確的字段數。
使用play-json庫(可作為獨立庫使用),您可以自由地向User類添加字段,而無需修改用於序列化/反序列化的play-json讀/寫/格式,例如Int,String類型等等。但是,如果您添加自定義類型,那么您當然需要為該字段編寫一個自定義序列化程序。
如果要進行與客戶不兼容的向后兼容更改,而又不知道新字段,則將其設置為Option類型,並且無需執行任何其他操作。
即使客戶端發送不帶customField的JSON,這也將起作用:
類User(val id:Int,val名稱:String,val age:Int,val customField:Option [String])
但是,如果客戶端不包括customField,則此操作將失敗(Play JSON不會將customField設置為null,就像Gson for Java所說的那樣):
類User(val id:Int,val名稱:String,val age:Int,val customField:String)
干杯,
如果您使用的是Play框架
case class User(val id: Int, val name: String, val age: Int)
implicit val userReads : Reads[User] = (
(__ \ "id").read[Int] ~
(__ \ "name").read[String] ~
(__ \ "age").read[Int]
)(User.apply _)
play.api.libs.json.Json.fromJson[User](incomingJson)
類似地定義Writes [User]
case class Car(id: Int, name: String, options: Map[Int, Long])
object Car{
implicit val carWrites = new Writes[Car] {
def writes(c: Car) = Json.obj(
"id" -> c.id,
"name" -> c.name,
"options" -> c.options.map(item=>{
Json.obj(
"id" -> item._1,
"name" -> item._2
)
})
)
}
implicit val carReads =
(__ \ "id").read[Int] ~
(__ \ "name").read[String] ~
(__ \ "options").read(
(__ \ "id").read[Int] ~
(__ \ "name").read[Long]
)
(Car)
}
然后使用Play進行輸出:
val x = Car(1,"Porsche",Map(0->1,1->2.toLong))
val json = Json.toJson(x)
Ok(json).as("application/json")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.