Как выбрать несколько столбцов из базы данных с помощью scala play2.6 и с правильным заголовком ответа json

У меня есть одна таблица Таблица сведений о пользователе, и она содержит столбцы ниже

User_ID, имя, электронная почта, Mobile_no, имя, фамилия, адрес

Я хочу выбрать эти 4 столбца (User_ID, Name, email, Mobile_no) данных, идентификатор пользователя которых равен 1, и я хочу, чтобы ответ был в правильном формате JSON.

Как это сделать в Scala Play 2.6 с Slick До сих пор я делал это

import play.api.mvc._
//import slick.driver.H2Driver.api._
import slick.jdbc.H2Profile.api._
import Services.HorseImageServices
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import com.google.gson.Gson

case class userss(User_ID:String,Name:String,email:String,Mobile_no:String)
class Testing @Inject()(cc: ControllerComponents) extends AbstractController(cc){


  def getPasswqord(username :String) = Action{
    import play.api.libs.json.{JsPath, JsValue, Json, Writes}
    val dbConfig = Database.forURL("jdbc:mysql://localhost:3306/equineapp?user=root&password=123456", driver = "com.mysql.jdbc.Driver")
    val a1=(sql"""select User_ID,Name,email,Mobile_no from equineapp.user_details_table where email=$username or Mobile_no=$username """.as[(String,String,String,String)]     )
    val res = Await.result(dbConfig.run(a1), 1000 seconds)

    val gson: Gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create

    //   val json = Json.toJson(res)
    //select User_ID,Name,email,Mobile_no from equineapp.user_details_table where email='' or Mobile_no=''
   // val writes : Writes[(String, String,String,String)] = (JsPath \ "password").write[String] and (JsPath \ "password").write[String]
    import play.api.libs.json._
    import play.api.libs.functional.syntax._

    implicit val locationWrites: Writes[(userss)] = (
      (JsPath \ "userid").write[String] and
        (JsPath \ "Name").write[String] and
        (JsPath \ "Email").write[String] and
        (JsPath \ "Mobile").write[String]
      )(unlift(userss.unapply))
    def toJson[T](sequence: Seq[T])(implicit writes: Writes[T]): JsValue = {
      Json.toJson(sequence)
    }

    implicit val residentWrites = Json.writes[(String,String,String,String)]
    Ok(toJson(res)(residentWrites))

   // Ok(Json.toJson(res.map(gson.toJson).map(Json.parse)))

  }

}

от этого я получаю ответ в формате

[{"_1": "86", "_ 2": "Abhinay", "_ 3": "abhinay4cs@gmail.com", "_ 4": "9739239812"}]

Ожидаемый выходной формат

[{"userid": "86", "Name": "Abhinay", "Email": "abhinay4cs@gmail.com", "Mobile": "9739239812"}]

0
0
78
2

Ответы 2

Вы используете неправильный пользовательский писатель.

Вам нужно использовать расположениеПисатели вместо резидент

Ваше решение: Ok(toJson(res)(locationWrites))

если я использую Ok (toJson (res) (locationWrites)), то я получаю "несоответствие типа исключения"; найдено: play.api.libs.json.Writes [controllers.userss] Требуется: play.api.libs.json.Writes [(Строка, Строка, Строка, Строка)] "

Abhinay 17.09.2018 12:09

Попробуйте val a1=(sql"""select User_ID,Name,email,Mobile_no from equineapp.user_details_table where email=$username or Mobile_no=$username """.as[userss])

Tarang Bhalodia 17.09.2018 14:44

нет, это не сработало как исключение "не удалось найти неявное значение для параметра rconv: slick.jdbc.GetResult [controllers.userss]"

Abhinay 17.09.2018 17:52

Предположим, у вас есть класс case:

case class User(userId: String, name: String, email: String, mobilePhone: String)

Чтобы иметь возможность преобразовать результат sql"""select User_ID,Name,email,Mobile_no from equineapp.user_details_table where email=$username or Mobile_no=$username """ в User, вам необходимо определить неявный GetResult:

implicit val getUserResult = GetResult(r => User(r.nextString, r.nextString, r.nextString, r.nextString))

Принесите этот getUserResult в область, где вы вызываете базу данных и преобразуете результат запроса в класс случая sql"""your sql query""".as[User]

Чтобы иметь возможность преобразовать экземпляр User в json, определите Сопутствующий объект с настраиваемым Writes[(User)]:

object User {
  implicit val jsonWrites: Writes[(User)] = (
      (JsPath \ "userid").write[String] and
        (JsPath \ "Name").write[String] and
        (JsPath \ "Email").write[String] and
        (JsPath \ "Mobile").write[String]
      )(unlift(User.unapply))
}

Теперь вы можете преобразовать результат в json в контроллере таким образом (записи Json будут найдены автоматически, потому что они определены в сопутствующем объекте):

Ok(toJson(res))

Другие вопросы по теме