簡體   English   中英

使用Play API將Scala對象分配給Json

[英]Scala object to Json with Play API

我需要處理這種問題尚未解決的情況: 將任何Scala對象轉換為JSON

基本上,我不知道如何處理列表和地圖類型。 我嘗試了以下無效的方法:

implicit val anyValWriter = Writes[Any] (a =>
  a match {
    case v: Double => Json.toJson(v)
    case v: Float => Json.toJson(v)
    case v: Long => Json.toJson(v)
    case v: Int => Json.toJson(v)
    case v: String => Json.toJson(v)
    case v: Iterable[Any] => Json.toJson(v.map(t => Json.toJson(t)).toList)
    case v: Map[String, Any] => JsObject(v.map { case (k, v) => (k, Json.toJson(v)) }.toList)
    // or, if you don't care about the value
    case _ => throw new RuntimeException("Type not serializable.")
})

產生的錯誤是: No Json serializer found for type Any. Try to implement an implicit Writes or Format for this type. No Json serializer found for type Any. Try to implement an implicit Writes or Format for this type.

嘗試將anyValWriter添加到Json.toJson導致: recursive value anyValWriter needs type

任何想法?

我終於通過解決方法解決了我的問題。 我選擇不處理IterableMap的類型Writes[Any]我用的包裝來處理這兩種類型在我的情況下, Any不會是任何的發生List[...]Map[String, Any]

這是對感興趣的人的代碼:

implicit val anyValWriter = Writes[Any] (a =>
  a match {
    case v: Double => Json.toJson(v)
    case v: Float => Json.toJson(v)
    case v: Long => Json.toJson(v)
    case v: Int => Json.toJson(v)
    case v: String => Json.toJson(v)
    case v: JsArray => v
    // or, if you don't care about the value
    case _ => throw new RuntimeException("Type not serializable.")
})

和包裝:

  def convertToJsonValue(v : Iterable[Map[String, Any]])(implicit write: Writes[Any]) = {
    JsArray(v.map(t => JsObject(t.map {
      case (k, value) => (k, Json.toJson(value)(write)) }.toList)).toList)
  }

我稍后會找出是否可以整理出丑陋的JsArray案例。

PS:我知道這是錯誤的,但是我正在使用返回Map [String,Any]的SQL API,因為我不知道將要返回的列(我有充分的理由並且不使用ORM功能) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM