【问题标题】:How to get json response output using Play Framework(Scala) for json objects from Postgresql table?如何使用 Play Framework(Scala) 为 Postgresql 表中的 json 对象获取 json 响应输出?
【发布时间】:2016-02-18 10:22:48
【问题描述】:

我正在尝试使用 Play 框架(Scala)从 Postgresql 数据库返回 json 响应数据。我尝试了以下方法:但我无法返回我的 json 响应输出。(因为我的数据库表中有几个 json 对象:jsondata,它有 id 和 name)。我得到:“type mismatch; found : anorm.SqlQuery required: String”。我不确定我在代码中哪里做错了从数据库(控制器和模型)获取我的 json 对象的 json 响应输出。请帮助我获得输出并提前致谢。

控制器:

import play.api.Play.current
import play.mvc.Controller;           
import play.libs.Json;
import play.libs.Json.*;                        
import com.fasterxml.jackson.databind.JsonNode;
import org.codehaus.jackson.JsonNode;           
import models.Getjsondata
import com.google.gson.Gson
import scala.util.{Try, Success, Failure}

 Getjsondata.getJsonValues(Getjsondata(Json.parse(id)), Json.parse(name));
 class MyController extends Controller {
 def getJson = Action { request =>
    println("calling getJson ... !!")//getting this message on play console
    val body: Anyname = request.body
    val textBody: Option[String] = body.asText
    val optionJson = textBody.flatMap(json => Try(Json.parse(json)).toOption)
    val bodyId = optionJson.map(_ \ "id")
    val bodyname = optionJson.map(_ \ "name")
    {
      for {
        id <- bodyId
        name <- bodyname
        json <- optionJson
      } yield {
        println("calling getJson else ... !!")
        val response = Getjsondata.getJsonValues(Getjsondata(id.as[Long],name.as[String]));
        Ok("Json data retrieved successfully: "+response)
      }
    } getOrElse BadRequest("Missing parameter either [id] or [name]")
  }
  }

型号:

import anorm._
import anorm.SqlParser._
import play.api.db._
import play.api.Play.current
import play.api.libs.json.{Json,JsValue}
import play.api.db.DB
import play.api.libs.json._
import anorm.~
import play.api.libs.functional.syntax._

case class Getjsondata (
  id: Pk[Long], name: String
)
object Getjsondata {
  val extractor = {
    get[Pk[Long]]("jsondata.id") ~
    get[String]("jsondata.name") map {
      case id~name => Getjsondata(id, name)
 }
 }
  def getJsonValues(jsondata: Getjsondata): String = {
  println("addJson getJsonValues page... !")
  DB.withConnection { implicit connection =>
 // SQL("select row_to_json(jsondata) from jsondata");
    SQL("select * from jsondata");//type mismatch; found : anorm.SqlQuery required: String
     }
     println("Test String... !") 
  }
}

【问题讨论】:

  • 您正在混合使用 Scala 和 Java 代码。也许尝试使用所有 Scala。
  • @Reactormonk,感谢您的回复,我可以知道如何在 Scala 中使用/编写我的控制器类吗?
  • 也许你可以看看文档并尝试一下?
  • @cchantep,我修改了问题描述,得到错误:类型不匹配;发现: anorm.SqlQuery required: String,请告诉我如何获取我的 json 响应。
  • @Reactormonk,我已经修改了问题描述,请告诉我我的代码哪里做错了。

标签: json postgresql scala playframework


【解决方案1】:

您的Scala controller 可能如下所示:

class MyController extends Controller {

  def getJson = Action { request =>
    println("calling getJson ... !!")

    val body: AnyContent = request.body
    val textBody: Option[String] = body.asText
    val optionJson = textBody.flatMap(json => Try(Json.parse(json)).toOption)

    val bodyId = optionJson.map(_ \ "id")
    val bodyName = optionJson.map(_ \ "name")

    {
      for {
        id <- bodyId
        name <- bodyName
        json <- optionJson
      } yield {
        println("calling getJson else ... !!")
        Getjsondata.getJsonValues(json)

        Ok("Json data retrieved successfully")
      }
    } getOrElse BadRequest("Missing parameter either [id] or [name]")
  }
}

【讨论】:

  • 感谢您的回复,如果我应用上面的代码,我会收到错误:类型不匹配;找到:play.api.libs.json.JsValue 需要:models.Getjsondata(在行:Getjsondata.getJsonValues(json))。
  • 是的,您的方法Getjsondata.getJsonValues(json) 采用Getjsondata 类型的输入值。您在该行中的代码应该类似于 Getjsondata.getJsonValues(Getjsondata(myId, myName)) 虽然我不确定 Pk[Long] 是什么。什么是PK? (一旦你告诉我,我可以告诉你需要改变什么才能让这段代码运行并有意义)。
  • 我的 Postgreql 数据库中有几个 json 对象,我需要的是:我需要从 Postgresql 数据库表(jsondata,具有 id,主键)中获取这些 json 对象(响应输出) (PK)的 Long 类型和 String 类型的名称)使用 Scala。这样我就可以在我的视图页面上以任何表格格式显示。
  • 请告诉我如何执行该代码以从数据库表中获取我的 json 响应(id 和名称)?根据要求需要进行哪些更改?(在控制器和模型类中)。提前致谢。
  • 这意味着在这个块的某处有一个失败for { id &lt;- bodyId name &lt;- bodyname json &lt;- optionJson } yield { println("calling getJson else ... !!") val response = Getjsondata.getJsonValues(Getjsondata(id.as[Long],name.as[String])); Ok("Json data retrieved successfully: "+response) }你的bodyIdbodynameoptionJson之一是None
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 2017-12-12
  • 2013-01-06
  • 2017-04-22
  • 1970-01-01
  • 2018-05-25
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多