簡體   English   中英

往返於包含地圖的JSON中加載對象列表

[英]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類型,並且無需執行任何其他操作。

  1. 即使客戶端發送不帶customField的JSON,這也將起作用:

    類User(val id:Int,val名稱:String,val age:Int,val customField:Option [String])

  2. 但是,如果客戶端不包括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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM