gpt4 book ai didi

json - 使用 Play 2.1.1 在 JSON 中迭代和重新格式化数组

转载 作者:行者123 更新时间:2023-12-03 17:52:25 24 4
gpt4 key购买 nike

解析 Json 数组后,我无法操作它。

我使用 post 方法在 Javascript 中传递以下 Json 对象: [{"id":"someid"},{"id":"anotherid"}]

我使用了 Andy 的设置( Iterating over an array in JSON with Play 2.1.1 )来解析使用 post 方法传递的 json 编码数组(为了方便起见,我将代码移到了 Controller 中)

  case class FBUser(
id: String
){}
object FBUser {
/** Uses a Scala Macro to define the Reads function */
implicit val userReads: Reads[FBUser] = Json.reads[FBUser]
implicit val fbUserFormat:Format[FBUser] = Json.format[FBUser]
}

def doQuery = Action (parse.json){ implicit request =>

val readIDFromInput = (__).read[List[FBUser]]

val IDs = request.body.validate(readIDFromInput)

IDs.map(
item => Ok(Json.toJson(item))
).recoverTotal{
err => BadRequest(JsError.toFlatJson(err))
}

}

这可以正常工作:它读取并返回 Json 对象。我在使用 Json 对象创建新变量时遇到问题。在这种情况下,我想构造一个像 {["someid", "anotherid"]} 这样的 Json 对象(即没有“id”)

首先我试过: item => Ok(Json.toJson(item.id)) // trying to access item.id
但这导致了一个错误:value id is not a member of object controllers.ScalaPoster.FBUser

我尝试向对象( def getId():String = { return this.id } )添加一个函数。访问( item.getId() )会导致相同的错误。

非常感谢所有帮助!

编辑(没有足够的声誉来回答我自己的问题):

添加另一个映射函数( Json.toJson(list.map{ item => item.id } )可以访问 id:
 case class FBUser(
id: String
)
implicit val fbUserFormat:Format[FBUser] = Json.format[FBUser]

def doQuery = Action (parse.json){ implicit request =>

var idsValid = true
var badReq = Json.obj();

val readIDFromInput = (__).read[List[FBUser]]

val listIDs = request.body.validate(readIDFromInput).map {

case list => Json.toJson(list.map{ item => item.id } )
}.recoverTotal{
e => {
idsValid = false
badReq = JsError.toFlatJson(e)
Json.arr() // empty array
}
}

if( idsValid )
Ok(listIDs)
else
BadRequest("Detected error:"+ badReq)
}

希望这可以帮助其他人:)

最佳答案

正如您已经注意到的,您必须使用 map 两次:第一次访问 JsResult 的内容,再次访问该 JsResult 中 List 的内容。通过这种方式,您可以访问您正在寻找的嵌套 id,并提出了一个可行的解决方案。

但是,我想指出一个相当优雅的解决方案,它可以在不依赖可变状态的情况下解决您的问题:

request.body.validate(readIDFromInput) match {
case JsSuccess(users, _) => Ok(users.map(_.id))
case JsError(errors) => BadRequest(errors)
}

我将验证与其两种可能的情况相匹配:要么它通过并返回带有 id 列表的 200,要么它失败并返回带有错误的 400。

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

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