2016-09-26 10 views
1

Я пытаюсь передать запрос POST API REST, разработанный с помощью Play! (2.5) объект, который я хотел бы использовать Scala Graph (из зависимости от графика). Похоже, что на графике уже есть методы сериализации/десериализации JSON, основанные на lift-json, но я не уверен, как «подключить» это к библиотеке Play Json. До сих пор я использовал неявные преобразователи (с методами Reads/Writes), но мне бы хотелось, чтобы не писать собственные методы для части графика, так как она уже является частью самой библиотеки.Scala Graph JSON с Play Framework

Например, скажем, у меня есть этот код:

import java.util.UUID 
import scalax.collection.Graph 

case class Task(
    id: UUID, 
    status: String) 

case class Stuff(
    id: UUID = UUID.randomUUID(), 
    name: String, 
    tasks: Option[Graph[Task, DiEdge]]) 

implicit val stuffWrites: Writes[Stuff] = (
    (JsPath \ "id").write[UUID] and 
    (JsPath \ "name").write[String] 
)(unlift(Stuff.unapply)) 

implicit val stuffReads: Reads[Stuff] = (
    (JsPath \ "id").read[UUID] and 
    (JsPath \ "name").read[String] 
)(Stuff.apply _) 

implicit val taskWrite: Writes[Task] = (
    (JsPath \ "id").write[UUID] and 
    (JsPath \ "status").write[String] 
)(unlift(Task.unapply)) 

implicit val taskReads: Reads[Task] = (
    (JsPath \ "id").read[UUID] and 
    (JsPath \ "status").read[String] 
)(Task.apply _) 

Я скучаю часть сериализовать график и воспитание детей. Должен ли я переписать все с нуля, или я могу полагаться на методы toJson/fromJson из scalax.collection.io.json?

ответ

0

Поскольку я боролся немного, чтобы получить эту работу, я думал, что я хотел бы поделиться код:

class UUIDSerializer extends Serializer[UUID] { 
    private val UUIDClass = classOf[UUID] 

    def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), UUID] = { 
    case (TypeInfo(UUIDClass, _), json) => json match { 
     case JString(id) => UUID.fromString(id) 
     case x => throw new MappingException("Can't convert " + x + " to UUID") 
    } 
    } 
    def serialize(implicit format: Formats): PartialFunction[Any, JValue] = { 
    case x: UUID => JString(x.toString) 
    } 
} 

val extraSerializers = new UUIDSerializer :: Nil 
implicit val formats = Serialization.formats(NoTypeHints) ++ extraSerializers 

val taskDescriptor = new NodeDescriptor[Task](typeId = "Tasks", customSerializers=extraSerializers) { 
    def id(node: Any) = node match { 
    case Task(id, _) => id.toString 
    } 
} 

val quickJson = new Descriptor[Task](
    defaultNodeDescriptor = taskDescriptor, 
    defaultEdgeDescriptor = Di.descriptor[Task]() 
) 
implicit val tasksWrites = new Writes[Graph[Task, DiEdge]] { 
    def writes(graph: Graph[Task, DiEdge]): JsValue = { 
    val json = graph.toJson(quickJson) 
    Json.parse(json.toString) 
    } 
} 

implicit val tasksReads = new Reads[Graph[Task, DiEdge]] { 
    def reads(json: JsValue): JsResult[Graph[Task, DiEdge]] = { 
    try { 
     val graph = Graph.fromJson[Task, DiEdge](json.toString, quickJson) 
     JsSuccess(graph) 
    } 
    catch { 
     case e: Exception => 
     JsError(e.toString) 
    } 
    } 
} 

implicit def stuffModelFormat = Jsonx.formatCaseClass[Stuff] 
0

Вы можете попробовать написать сопутствующие объекты для ваших классов case, где вы указываете форматирование.

Пример:

object Task { 
    implicit val taskModelFormat = Json.format[Task] 
} 

object Stuff { 
    implicit val staffModelFormat = Json.format[Stuff] 
} 

вместо указанной выше implicits. С помощью этого решения компилятор разрешит известные форматы для вас, и вам может потребоваться указать только отсутствующие/неизвестные типы, а не всю структуру.

+0

Спасибо! В самом деле, я видел это, когда вчера перечитывал документацию Play. Но я все еще пропущу часть о том, как бороться с графиком Scala :-). – CanardMoussant

+0

Ну, вы можете написать implicits для отсутствующих типов, и в этих классах возвратить String, обработанную с помощью Lift ... или полностью переключиться на Lift. В противном случае вам придется найти/написать новый парсер. – Atais

+0

Я изо всех сил стараюсь сделать это, к сожалению. Я отправлю что-то здесь, если мне удастся что-то сделать. – CanardMoussant

Смежные вопросы