2016-09-23 3 views
4

書き込みI次のコードを持っている:Scalaのコンパイラ(2.11.7)はプレイJSONで異常がそう

ベース:

case object Cost { 
    def writes = new Writes[Cost] { 
    override def writes(r: Cost): JsValue = { 
     val cost = r.cost.map(Json.toJson(_)).getOrElse(JsNull) 
     Json.obj(
     "cost" -> cost 
    ) 
    } 
    } 
} 

をしかし、これにはない:

import play.api.libs.json.{JsNull, Json, JsValue, Writes} 
case class Cost(cost: Option[Double]) 

これはコンパイルコンパイル

case object Cost { 
    def writes = new Writes[Cost] { 
    override def writes(r: Cost): JsValue = { 
     Json.obj(
     "cost" -> r.cost.map(Json.toJson(_)).getOrElse(JsNull) 
    ) 
    } 
    } 
} 

コンパイラエラーは次のとおりです後者で

type mismatch; 
[error] found : Object 
[error] required: play.api.libs.json.Json.JsValueWrapper 
[error]   "cost" -> r.cost.map(Json.toJson(_)).getOrElse(JsNull) 

を私は.asInstanceOfを使用する場合は、[JsValue]それは動作しますが、IntelliJのは、それはとにかくJsValueその何かことができないとして、それは不要だと言って、それをグレーで:INGの。 Scalaコンパイラ(2.11.7)がクラスを正しく検出しない理由は何でしょうか?

+0

SBTで直接コンパイルしますか? – cchantep

+0

はい、SBTからコンパイルします。 – mpartan

答えて

2

私は正常にこのコードをコンパイルしている問題は.getOrElse(JsNull)

から来ているかなり確信している:

import play.api.libs.json.{JsNull, Json, JsValue, Writes} 

case class Cost(cost: Option[Double]) 

case object Cost { 
    def writes = new Writes[Cost] { 
    override def writes(r: Cost): JsValue = { 
     Json.obj(
     "cost" -> r.cost.map(Json.toJson(_)) 
    ) 
    } 
    } 
} 

と出力を解析された:

ソースを探してい
scala> Cost(Some(5)) 
res2: Cost = Cost(Some(5.0)) 

scala> Json.toJson(res2)(Cost.writes) 
res5: play.api.libs.json.JsValue = {"cost":5} 

をあなたは追加の解決策のカップルをチェックすることができます、書き込み機能を前提にイオン:

val cost = r.cost.map(t => Json.toJson(t)) 
Json.obj(
    "cost" -> cost 
) 

あなたは(あなたがしようとしたとして)キャストまたはいずれかのタイプを提供することができますgetOrElseOptioncostの値を解決したい場合:

cost.getOrElse[JsValue](JsNull) 
cost.getOrElse(JsNull).asInstanceOf[JsValue] 

をし、型指定sbtなし常に

[error] (...) type mismatch; 
[error] found : Object 
[error] required: play.api.libs.json.Json.JsValueWrapper 

いくつかのSBTのコンパイラのバグから来る必要があります。

+0

それは私が望むように動作するようです。以前はデフォルトのwrite = Json.writes [コスト]を使用していましたが、これはJSONにNoneフィールドが含まれていないため、APIに必要なものです。 JsNullはJsValueであり、Json.toJsonの戻り値であるため、元の投稿のコンパイラー・タイプのエラーについては説明しません。 – mpartan

+0

@mpartan SBTバグでなければなりません。更新を参照してください。 – Atais

関連する問題