如何解析从HTTP接收的Json字符串并循环遍历这些值
我正在使用Scala和Swagger,我需要帮助了解如何循环json中的值,并使用这些值进行检查和其他操作 HTTP get请求后返回的json字符串如下所示:如何解析从HTTP接收的Json字符串并循环遍历这些值,json,scala,httpclient,swagger,scalatra,Json,Scala,Httpclient,Swagger,Scalatra,我正在使用Scala和Swagger,我需要帮助了解如何循环json中的值,并使用这些值进行检查和其他操作 HTTP get请求后返回的json字符串如下所示: { "count": 3, "items": [ { "Id": "fd0a9e5a", "DbName": "Xterior Prod", "Name": "XP" }, { "Id": "4158a1a6", "DbName": "Invidibi Pappear", "Name
{
"count": 3,
"items": [
{
"Id": "fd0a9e5a",
"DbName": "Xterior Prod",
"Name": "XP"
},
{
"Id": "4158a1a6",
"DbName": "Invidibi Pappear",
"Name": "ISP"
},
{
"Id": "7e0c57046d3f",
"DbName": "Multi Test",
"Name": "MMP"
}]
}
我的UI允许用户输入一个ID。我要做的是循环通过API返回的Json值,找到与输入的ID匹配的值。找到匹配项后,我必须检查数据库中是否有“Test”关键字。如果有,我需要显示DbName和shortname
我在这里找到了一些指南,但它对我不起作用。当我运行代码时,出现以下错误:
play.api.libs.json.JsResultException: JsResultException(errors:List(((0)/Id,List(ValidationError(List(error.path.missing),WrappedArray()))), ((0)/DbName,List(ValidationError(List(error.path.missing),WrappedArray()))), ((1)/Id,List(ValidationError(List(error.path.missing),WrappedArray()))), ((1)/DbName,List(ValidationError(List(error.path.missing),WrappedArray()))), ((2)/Id,List(ValidationError(List(error.path.missing),WrappedArray()))), ((2)/DbName,List(ValidationError(List(error.path.missing),WrappedArray()))),
这是我的密码:
case class DBInfo(Id: String, DbName: String, Name: String)
contentType = "application/json"
//get json from http
val httpClient = HttpClients.createDefault()
val httpResponse = httpClient.execute(new HttpGet("http://www.customers.com/dbInfo"))
val entity = httpResponse.getEntity
val content = fromInputStream(httpResponse.getEntity.getContent()).getLines().mkString
implicit val dbReader = Json.reads[DBInfo]
val dbList = (Json.parse(content) \ "items").as[List[DBInfo]]
dbList.foreach { dbI =>
if (dbI.Id == id)
if (dbI.DbName.contains("Test"))
println(dbI.DbName + " - " + dbI.Name)
else BadRequest("Not allowed")
else
BadRequest("ID not found")
}
id是保存用户输入的id的变量。有人能告诉我为什么会出错以及如何修复它吗?谢谢
注意:请使用import org.json4s.JsonAST或import play.api.libs.json。您可以使用光标导航JSON,并使用Decoder[a]
typeclass解码到Environment
列表。请注意,您使用的是或[Failure,A]
值
import io.circe._
case class Environment(id: String, dbName: String, name: String)
implicit val environmentDecoder: Decoder[Environment] = Decoder.instance[Environment] {
json =>
for {
id <- json.downField("Id").as[String]
dbName <- json.downField("DbName").as[String]
name <- json.downField("Name").as[String]
} yield {
Environment(id, dbName, name)
}
}
// alternatively:
// implicit val environmentDecoder: Decoder[Environment] =
// Decoder.forProduct3[String, String, String, Environment]("Id", "DbName", "Name")(Environment.apply)
val text =
"""{
| "count": 3,
| "items": [{
| "Id": "fd0a9e5a",
| "DbName": "Xterior Prod",
| "Name": "XP"
| }, {
| "Id": "4158a1a6",
| "DbName": "Invidibi Pappear",
| "Name": "ISP"
| }, {
| "Id": "7e0c57046d3f",
| "DbName": "Multi Match Test",
| "Name": "MMP"
| }]
|}
""".stripMargin
val json = parser.parse(text).fold(_ => ???, json => json)
val res: Either[DecodingFailure, List[Environment]] = json.hcursor.downField("items").as[List[Environment]]
println(res)
// Right(List(Environment(fd0a9e5a,Xterior Prod,XP), Environment(4158a1a6,Invidibi Pappear,ISP), Environment(7e0c57046d3f,Multi Match Test,MMP)))
// or simply
// val res2 = parser.parse(text).right
// .flatMap(_.hcursor.downField("items").as[List[Environment]])
已经得到了答案。我就是这样做的:
case class databaseInfo(Id: String, DbName: String, Name: String)
class dbInfo{
def CheckDb(id: String): Option[String] = {
val httpClient = HttpClients.createDefault()
val httpResponse = httpClient.execute(new HttpGet("http://example.com"))
val content = fromInputStream(httpResponse.getEntity.getContent()).getLines().mkString
val envItems = (parse(content) \\ "items").children
for (items <- envItems) {
val dbItems = items.extract[databaseInfo]
if (dbItems.EnvId == Some(id)) {
if (equalsIgnoreCase(dbItems.DbName.mkString, "Test")) //do something
else //do something
}
}
None
}
}
case类数据库信息(Id:String,DbName:String,Name:String)
类dbInfo{
def CheckDb(id:String):选项[String]={
val httpClient=HttpClients.createDefault()
val httpResponse=httpClient.execute(新的HttpGet(“http://example.com"))
val content=fromInputStream(httpResponse.getEntity.getContent()).getLines().mkString
val envItems=(解析(内容)\\“项”).children
对于(hi)项,有没有一种方法可以使用json4s或play来实现这一点?这些已经是当前项目中实现json的方法,为了保持一致性,我更愿意使用这些库。
case class databaseInfo(Id: String, DbName: String, Name: String)
class dbInfo{
def CheckDb(id: String): Option[String] = {
val httpClient = HttpClients.createDefault()
val httpResponse = httpClient.execute(new HttpGet("http://example.com"))
val content = fromInputStream(httpResponse.getEntity.getContent()).getLines().mkString
val envItems = (parse(content) \\ "items").children
for (items <- envItems) {
val dbItems = items.extract[databaseInfo]
if (dbItems.EnvId == Some(id)) {
if (equalsIgnoreCase(dbItems.DbName.mkString, "Test")) //do something
else //do something
}
}
None
}
}