2017-06-01 2 views
0

Ich habe versucht, Kartendaten aus Json zu extrahieren.scala - play json JsValue konvergieren zum generischen Typ

def getMap[K, V](js: JsValue, key: String): Map[K, V] = { 
     js \ key match { 
      case JsDefined(v) => v.as[Map[K, V]] // error here 
      case _: JsUndefined => throw new Exception("Error") 
     } 
    } 

Kein Json Deserializer für Typ-Karte gefunden [K, V]. Versuchen Sie, ein implizites Lesen oder Formatieren für diesen Typ zu implementieren. nicht genug Argumente für Methode als: (implizite fjs: play.api.libs.json.Reads [Karte [K, V]]) Karte [K, V]. Nicht spezifizierter Wertparameter fjs.

Diese Funktion funktioniert, wenn ich bestimmte Art für Karte (ex definieren.? V.as [Map [String, Int]], aber nicht in generic Wie soll ich damit machen

Antwort

1

An einem gewissen Punkt Sie werden eine bestimmte K und V haben müssen zu diesem Zeitpunkt Sie die impliziten Leser in (impliziten) Umfang benötigen, bis dahin können Sie sie nur implizit übergeben.

def getMap[K, V](js: JsValue, key: String)(implicit reads: Reads[Map[K,V]]): Map[K, V] = { 
     js \ key match { 
      case JsDefined(v) => v.as[Map[K, V]] // error here 
      case _: JsUndefined => throw new Exception("Error") 
     } 
    } 

ich bin nicht sicher, warum würden Sie Richten Sie es auf diese Weise ein. Warum nicht auch

(js \ key).as[Map[K,V]] , wenn Sie es wünschen, einen Fehler zu werfen oder (js \ key).asOpt[Map[K,V]] , wenn eine Option als auch in Ordnung ist. Oder auch möglich (js \ key).validate[Map[K,V]]

+0

Danke, du hast mich gerettet :) –