Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向JSON加载对象列表,并从JSON加载包含映射的对象列表_Json_Scala - Fatal编程技术网

向JSON加载对象列表,并从JSON加载包含映射的对象列表

向JSON加载对象列表,并从JSON加载包含映射的对象列表,json,scala,Json,Scala,我收集了一些对象,如: class Car(val id: Int, val name: String) 然后,我将有一个列表中的汽车集合 List[Car](); 我希望能够将列表[Car]转换为JSON字符串,然后从JSON字符串加载回来 作为旁注,这个转换过程有多不稳定,比如说我向我的用户对象添加了另一个属性?(注意:我不想要解决这个问题的答案,只是想知道添加一个项目是否会破坏它) 更新 如何正确处理贴图,如:Map[Int,Long] 假设我的模型已更新,其中包含地图: 我使用pl

我收集了一些对象,如:

 class Car(val id: Int, val name: String)
然后,我将有一个列表中的汽车集合

List[Car]();
我希望能够将列表[Car]转换为JSON字符串,然后从JSON字符串加载回来

作为旁注,这个转换过程有多不稳定,比如说我向我的用户对象添加了另一个属性?(注意:我不想要解决这个问题的答案,只是想知道添加一个项目是否会破坏它)

更新

如何正确处理贴图,如:Map[Int,Long]

假设我的模型已更新,其中包含地图:

我使用play的json创建隐式写入,如:

implicit val carWrites = new Writes[Car] {
  def writes(c: Car) = Json.obj{
    "id" -> c.id
    "name" -> c.name
    //"options" -> t.options
  }
}

目前我看到一个错误:没有找到类型映射[Int,Long]的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]]

将字段添加到用户类只需要将jsonFormat更新为正确的字段数。

您是否使用任何现有工具包来完成此操作?我有这方面的经验。您不必使用整个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]]

向用户类添加字段只需要将jsonFormat更新为正确的字段数。

使用play json库(作为独立库提供),您可以自由地向用户类添加字段,而无需修改用于序列化/反序列化的play json读/写/格式,例如Int类型,但是,如果添加自定义类型,那么当然需要为该字段编写自定义序列化程序

如果您想做出与客户端向后兼容的更改,而不知道新字段,那么将它们设置为type选项,不需要做更多的事情

  • 即使客户端发送JSON时没有customField,这也会起作用:

    类用户(val-id:Int,val-name:String,val-age:Int,val-customField:Option[String])

  • 但是,如果客户端不包含customField,则此操作将失败(Play JSON不会像Gson for Java那样将customField设置为null):

    类用户(val id:Int,val name:String,val age:Int,val customField:String)


  • 干杯,

    使用play json库(作为独立库提供),您可以自由地向用户类添加字段,而无需修改用于序列化/反序列化的play json读/写/格式,例如Int类型,但是,如果添加自定义类型,那么当然需要为该字段编写自定义序列化程序

    如果您想做出与客户端向后兼容的更改,而不知道新字段,那么将它们设置为type选项,不需要做更多的事情

  • 即使客户端发送JSON时没有customField,这也会起作用:

    类用户(val-id:Int,val-name:String,val-age:Int,val-customField:Option[String])

  • 但是,如果客户端不包含customField,则此操作将失败(Play JSON不会像Gson for Java那样将customField设置为null):

    类用户(val id:Int,val name:String,val age:Int,val customField:String)


  • 干杯,

    如果您正在使用Play framework

    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)    
    

    如果您使用的是Play framework,则类似地定义写入[User]

    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)    
    
    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)
    
    
    
    }
    
    类似地定义写入[用户]

    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)
    
    
    
    }
    
    然后,如果使用播放,则输出:

     val x = Car(1,"Porsche",Map(0->1,1->2.toLong))
     val json = Json.toJson(x)
     Ok(json).as("application/json")
    
    然后,如果使用播放,则输出:

     val x = Car(1,"Porsche",Map(0->1,1->2.toLong))
     val json = Json.toJson(x)
     Ok(json).as("application/json")
    

    如何为映射[Int,String]写“写”?如何为映射[Int,String]写“写”?@GamesBrainiac我已经包含了我到目前为止的状态。@GamesBrainiac我已经包含了我到目前为止的状态。这不起作用,映射中的键可以是任何随机的Int值。这只适用于映射中有0和1的情况。是的,这很有效,有点棘手,读取如何?您可以发布json的外观吗?我刚刚将读取粘贴到我的应用程序中,发现了这些错误,我甚至还没有使用json对其进行测试。让我们来看看。这不起作用,映射中的键可以是任何随机的Int值。这只适用于映射中有0和1的情况。是的,这很有效,有点棘手,读取如何?你能发布你的json外观吗?我刚刚将你的读取粘贴到我的应用程序中,我发现了这些错误,我甚至还没有用json测试它。让我们来看看。