Scala 如何从JSON检索和注入节
如果我有一个如下结构的传入JSONScala 如何从JSON检索和注入节,scala,playframework,slick,shapeless,Scala,Playframework,Slick,Shapeless,如果我有一个如下结构的传入JSON [ { "personId" : 12, "name": "John Doe", "age": 48, "birthdate": "12/1/1954", "relationships": [ { "relationType":"parentOf", "value" : "Johnny walker"
[
{
"personId" : 12,
"name": "John Doe",
"age": 48,
"birthdate": "12/1/1954",
"relationships": [
{
"relationType":"parentOf",
"value" : "Johnny walker"
},
{
"relationType":"sonOf",
"value" : "Charles Smith"
}
]
},
{
"personId" : 13,
"name": "Merry Christmas",
"age": 28,
"birthdate": "12/1/1985",
"relationships": [
{
"relationType":"sisteOf",
"value" : "Will Smith"
},
{
"relationType":"cousinOf",
"value" : "Brad Pitt"
}
]
}
]
而且要求是,对于每个人
记录控制器必须在保存该传入JSON的同时,划出关系
数组,并将其中的每个记录存储在一个单独的关系
表中,该表具有personId
关联
随后,当查询这些人员
记录时,系统必须从关系
表中为每个人员
查找关系
,并将其注入,形成相同的上述JSON,以返回UI进行呈现
使用Scala中的Play framework执行此“切出”和后续“注入”操作的最佳有效方法是什么?(使用Slick in persistent layer API)我已经查看了其中的JSON转换链接和
JSON.pickBranch
,但不确定这是否完全适用于示例中所示的准备JSON的“切出”和“注入”用例。有什么好主意吗?一种非常简单的方法是使用case
类和PlayJson
inception
import play.api.libs.json.Json
case class Relationship(relationType: String, value: String)
object Relationship {
implicit val RelationshipFormatter = Json.format[Relationship]
}
case class Person(personId: String, name: String, age: Int, birthdate: String, relationships: Seq[Relationship]) {
def withRelationships(relationship: Seq[Relationship]) = copy(relationships = relationships ++ relationship)
}
object Person {
implicit val PersonFormatter = Json.format[Person]
}
现在,您可以使用以下代码将json值转换为Person
,前提是jsValue
是类型为jsValue
的json值(在播放控制器中,您可以通过request.body.asJson
获得该值):
在播放控制器中,您可以
要将Person
转换为json,您可以使用以下代码,前提是Person
在您的上下文中是Person
类型的值:
Json.toJson(person)
唯一剩下的是你的光滑的模式,这是非常直截了当的
一个选项是为人员
使用一个简单的模式,不带关系,为关系
使用一个模式,外键指向人员
表。然后,您需要找到与特定的人
相关的所有关系,即人
,然后通过调用withRelationships
方法将它们附加到该人
,该方法为您提供一个新的人
,您可以将其用作json:
val person = .... // find person
val relations = .... // find relationships associated with this person
val json = Json.toJson(person.withRelationships(relations))
val person = .... // find person
val relations = .... // find relationships associated with this person
val json = Json.toJson(person.withRelationships(relations))