Json 通过读取[T]将JsValue转换为模型,该读取[T]包含任意元组列表的一部分和已知对象的一部分

Json 通过读取[T]将JsValue转换为模型,该读取[T]包含任意元组列表的一部分和已知对象的一部分,json,scala,playframework,playframework-2.5,Json,Scala,Playframework,Playframework 2.5,这个问题与我几周前问的问题类似 因此,我的API返回以下数据: {"firstName": "John", "age": "30", "ssn": "12345"} 此结果的一部分(例如firstName)是预先知道的,但在转换JsValue(在本例中为age和ssn)时,大部分数据是未知的 未知的属性应转换为元组列表 我已经有了一个读取的工作解决方案,它将JSON转换为一个由元组列表组成的模型。但是,我不知道如何从预先知道的tupleReads中排除元素 例如: case class Mod

这个问题与我几周前问的问题类似

因此,我的API返回以下数据:

{"firstName": "John", "age": "30", "ssn": "12345"}
此结果的一部分(例如
firstName
)是预先知道的,但在转换
JsValue
(在本例中为
age
ssn
)时,大部分数据是未知的

未知的属性应转换为元组列表

我已经有了一个
读取
的工作解决方案,它将JSON转换为一个由元组列表组成的模型。但是,我不知道如何从预先知道的
tupleReads
中排除元素

例如:

case class Model(firstName: String, elements: List[(String, String)])

implicit def tupleReads[A](implicit rds: Reads[A]): Reads[List[(String, A)]] = Reads.mapReads(rds).map(_.toList)

implicit val elementsReads: Reads[Model] = tupleReads[String].map(tuples => Model(firstName = ??, elements = tuples)) // ??

val result = json.validate[Model]

我想换一种方式,但首先说字段在大多数情况下都是
String
,这似乎不可靠,或者你真的期望代码只在大多数情况下有效吗

因此,我采用了您的模型:

case class Model(firstName: String, elements: List[(String, JsValue)])
其内容如下:

val modelReads: Reads[Model] =
  ((__ \ 'firstName).read[String] and
    __.read(Reads.mapReads[JsValue].map(_.toList)))(Model)
其工作原理如下所示:

scala> Json.parse("""{"firstName": "John", "age": "30", "ssn": "12345"}""")
res0: play.api.libs.json.JsValue = {"firstName":"John","age":"30","ssn":"12345"}

scala> res0.validate[Model](modelReads)
res1: play.api.libs.json.JsResult[Model] = JsSuccess(Model(John,List((firstName,"John"), (age,"30"), (ssn,"12345"))),)

您的所有字段(包括已知字段)是否都是相同类型的(
String
,在您的示例中)?所有字段不一定共享相同的类型,但在大多数情况下,它们都是
String
s。