2016-11-04 4 views
0

테이블 이름을 매개 변수로 사용하는 SELECT 메서드를 컨트롤러에 제공하고 SELECT 쿼리의 결과를 JSON으로 반환하고 싶습니다. 지금까지이 짓을 : tableObjectFactory 내 테이블 이름을 사용하고, 특정 유형의 TableQuery을 반환Scala Slick : 쿼리 결과를 변수 테이블에 직렬화하는 방법

def specialSelect(tableName: String) = Action.async { 
    val tq: TableQuery[_] = tableObjectFactory(tableName) 
    val res: Future[Seq[_]] = db.run(tq.result) 
    res.map { p:Seq[_] => Ok(p.toJson) } 
} 

:

def tableObjectFactory(tableName: String): TableQuery[_] = { 
    tableName match { 
    case "users" => TableQuery[Users] 
    case "projects" => TableQuery[Projects] 
    } 
} 

AA 일반적인 Seq[_]에 대해 정의 된 JSON 시리얼 라이저가 (이 없기 때문에 실패하는 경우 사실 _Product with Serializable이어야하며 도움이되는지 확실하지 않습니다.

테이블 이름은 미리 알지 못하며 (예 : "/special_select/<tableName>"과 같은 URL에서 찾을 수 있습니다.) 각 테이블에 대해이를 구현할 수 없도록 120 개의 테이블이 있습니다.

어떤Seq[_]를 직렬화하는 방법은 _ 항상 슬릭 행 결과 (예를 들어, 경우 클래스 UsersRow), 테이블이 어떤 것을 알고 있는가?

일반 DAO 및 ActiveSlick에 대해 읽었지만 지금까지해야하는지 잘 모르겠습니다.

+0

각 사례 클래스는 필드의 수와 유형이 다를 수 있으므로 일반적인 Json 작성은 어렵습니다. 각 모델에 대해'implicit json format '을 제공하십시오. 'Json.format [User]'를 호출합니다. – pamu

+0

Scala는'Seq [(Product with Serializable)]'또는 이와 비슷한 것을 볼 수 있기 때문에 각 행 객체에 대해 Json 포맷터가 제공하는 것을 신경 쓰지 않습니다. Json 포매터를 제공 한 사례 클래스가 지금까지 볼 수있는 유일한 클래스라는 것을 알 수 없습니다. – JulienD

+1

맞지만 제품의 튜플 수는 전달하는 객체에 따라 다릅니다. 따라서 제품을 JSON으로 변환하는 방법을 설명 할 수있는 하나의 형식이있을 수 없습니다. 리플렉션을 사용하여 솔루션에서 사용해야합니다. Gson 라이브러리 – pamu

답변

0

Gson, thanks @pamu.

libraryDependencies += "com.google.code.gson" % "gson" % "2.8.0" 

이 build.sbt하기 위해, 다음이 HTTP 응답으로 제공 할 수있는 JsArray 모든 Seq[_] 또는 행을 변환합니다 추가

import com.google.gson.Gson 
import play.api.libs.json._ 

val gson: Gson = new Gson() 

def slickToJson(res: Seq[_]): JsArray = { 
    JsArray(res.map(gson.toJson).map(Json.parse)) 
} 

// in controller Action.async: 
db.run(...).map(p => Ok(slickToJson(p))) 

행이 GSON에 의해 ​​문자열로 직렬화, 다시 구문 분석 Play api에서 JsObjects로 이동 한 다음 JsArray에 넣습니다. 나는 더 잘 찾을 수 없었다.

관련 문제