向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选项,不需要做更多的事情
干杯,使用play json库(作为独立库提供),您可以自由地向用户类添加字段,而无需修改用于序列化/反序列化的play json读/写/格式,例如Int类型,但是,如果添加自定义类型,那么当然需要为该字段编写自定义序列化程序 如果您想做出与客户端向后兼容的更改,而不知道新字段,那么将它们设置为type选项,不需要做更多的事情
干杯,如果您正在使用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测试它。让我们来看看。