gpt4 book ai didi

json - 使用 Play 2.1.1 在 JSON 中迭代数组

转载 作者:行者123 更新时间:2023-12-03 14:39:29 25 4
gpt4 key购买 nike

我正在使用 play 2.1.1,但在遍历数组时遇到问题。我在某处读到你可以为 List[Object] 创建一个读取,但每次我尝试这样做时我都会收到一个错误 "No unapply function found"对于说的那一行
implicit val userListReads: Reads[List[FBUser]] = Json.reads[List[FBUser]]". The issue is " = Json.reads[List[FBUser]]
我不知道还有什么可以尝试的。任何帮助将不胜感激。

def linkUsers() = Action { implicit request =>
val json = Json.parse("{\"data\": [{\"name\": \"Me Lazyan\",\"id\": \"1182\"},{\"name\": \"Chales Dselle\",\"id\": \"10115\"},{\"name\": \"Be My\",\"id\": \"10275\"},{\"name\": \"De Rwani\", \"id\": \"11189\"},{\"name\": \"Phoe Johon\", \"id\": \"11372\"}]}")

val peoples = json.validate[List[FBUser]].get
peoples.foreach(println)

Ok(json).withHeaders(CONTENT_TYPE -> "text/json")
}

case class FBUser(
name: String,
id: String
)

object FBUser {
/** Uses a Scala Macro to define the Reads function */
implicit val userReads: Reads[FBUser] = Json.reads[FBUser]
implicit val userListReads: Reads[List[FBUser]] = Json.reads[List[FBUser]]
}

最佳答案

目的

即使@martin 的回答给出了关于 json 消息和预期结果之间不匹配的直接解决方案,我也想给你一些建议,以一种干净的方式来实现你的目标。

那是因为,AFAICK,您重新定义了太多东西,并且您可能会遇到未报告错误的情况……但只是被 NoSuchElementException 之类的不同错误隐藏了。

最后,我想提供一个解决方案,您的消息保持不变(就像第二个@Martin 的解决方案一样)。

主张

这个想法是将事情打包成他们的职责,代码也被分成三个不同的文件:
FBUser.scala它只是声明了模型结构

package models

case class FBUser(
name: String,
id: String
)
formats.scala这是一个将收集所有格式定义的包,特别是 json 格式:
package models

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.json.util._
import play.api.libs.json.Json._
import play.api.libs.functional.syntax._

package formats {

object jsons {
implicit val fbUserFormat:Format[FBUser] = Json.format[FBUser]
}

}

注意 List[FBUser] 的格式未提供,因为 json api 将解析为隐式和通用 ReadsOWrites .

最后, Application.scala将包含仅与某些用例相关的代码,例如包含 data 的 json 对象字段,列表 FBUser .
package controllers

import play.api._
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.json.Json._

import models._

object Application extends Controller {

import models.formats.jsons._
val readUserFromInput = (__ \ 'data).read[List[FBUser]]

def index = Action {
val jsonString = "{\"data\": [{\"name\": \"Me Lazyan\",\"id\": \"1182\"},{\"name\": \"Chales Dselle\",\"id\": \"10115\"},{\"name\": \"Be My\",\"id\": \"10275\"},{\"name\": \"De Rwani\", \"id\": \"11189\"},{\"name\": \"Phoe Johon\", \"id\": \"11372\"}]}"

val json = Json.parse(jsonString)
val users = json.validate(readUserFromInput)

users.map(
list => Ok(Json.toJson(list)) // or Ok(json) to match exactly you example
).recoverTotal{
err => BadRequest(JsError.toFlatJson(err))
}
}

}

在这个 Controller 中,我们可以看到它定义了具体的 Reads对于初始情况,因此访问数据字段和读取 FBUser由于使用了 validate,实例是安全的, maprecoverTotal .

一些单词

关于安全的最后说明, Json.parse不安全,因此为了更加安全,您应该根据您的工作流程考虑一些选项,其中一些是:
* 使用 json 正文解析器,它可以让您明确处理错误的 json 格式
* 使用 Controller 中为这个特定案例定义的专用案例类(然后定义它的 Reads/... 使用 inception 就像 FBUser )

关于json - 使用 Play 2.1.1 在 JSON 中迭代数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com