2017-01-03 9 views
0

次のコードがあります。Scala:タイプAnyのJsonシリアライザが見つかりません

+--------------------+----------+----------+----------+----------------------+ 
|   flagcountry|max(count)|min(count)|avg(count)|stddev_samp(count,0,0)| 
+--------------------+----------+----------+----------+----------------------+ 
|    Cyprus|  65|  46|  55.0|  9.40744386111339| 
|   Luxembourg|   3|   1|  2.5| 0.9999999999999999| 
|    Niue|   5|   3|  4.4| 0.8944271909999159| 
|   Palestine|   2|   1|  1.25| 0.49999999999999994| 
|    Norway|  30|  18|  23.4|  5.683308895353129| 
|   Mongolia|  21|  15|  17.6|  2.302172886644268| 
|   Dominica|   1|   1|  1.0|     0.0| 
|British Virgin Is...|   1|   1|  1.0|     NaN| 
+--------------------+----------+----------+----------+----------------------+ 

今STDDEV(「カウント」)はダブルまたはナンのいずれかであることができる:ここではvesselFlagCountryDF

root 
|-- flagcountry: string (nullable = true) 
|-- max(count): long (nullable = true) 
|-- min(count): long (nullable = true) 
|-- avg(count): double (nullable = true) 
|-- stddev_samp(count,0,0): double (nullable = false) 

そして、ここでのスキーマは、いくつかのサンプル行されています。

この行で
import play.api.libs.json.{JsValue, Json} 

    val vesselFlagCountryDF = 
    vtype.groupBy("flagcountry").agg(max("count"), min("count"), avg("count"), 
        stddev("count")) 

    vesselFlagCountryDF.collect().foreach(row => { 
    val flagCountry = row.getString(row.fieldIndex("flagcountry")) 
    val upper: Long = row.getLong(row.fieldIndex("max(count)")) 
    val lower: Long = row.getLong(row.fieldIndex("min(count)")) 
    val mean: Double = row.getDouble(row.fieldIndex("avg(count)")) 
    val stdDevWrapper: Any = row.get(row.fieldIndex("stddev_samp(count,0,0)")) 
    val stdDev = stdDevWrapper match { 
     case d: Double => d 
     case _ => "NaN" 
    } 

    val json: JsValue = Json.obj(
     "type" -> "statistics", 
     "name" -> "vesselCountByFlagCountry", 
     "flagCountry" -> flagCountry, 
     "timeInterval" -> Json.obj("startTime" -> startTime, "endTime" -> endTime), 
     "upper" -> upper, 
     "lower" -> lower, 
     "mean" -> mean, 
     "stdDev" -> stdDev 
    ) 

 "stdDev" -> stdDev 

私は次のエラーを取得する:

No Json serializer found for type Any. Try to implement an implicit Writes or 
Format for this type. 
[error]   "stdDev" -> stdDev 

この間違いを処理するための最良の方法は何ですか?

答えて

4

という用語は、DoubleStringを統一する親のタイプがないため、次の用語は推測できませんが、これはお勧めしません。他方の側で

val stdDev = stdDevWrapper match { 
    case d: Double => d 
    case _ => "NaN" 
} 

、JSONのシリアル化は、だけでなく、型付き値、Any値の場合で動作します。

stdDevをリファクタリングして、場合によっては適切なJSON値を直接書き込むことができます。

val stdDev: JsValue = stdDevWrapper match { 
    case d: Double => Json.toJson(d) 
    case _ => Json.toJson("NaN") 
} 
関連する問題