Scala 如何从JSON检索和注入节

Scala 如何从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"

如果我有一个如下结构的传入JSON

[
   {
      "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
类和Play
Json
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))