scala - 播放json JsValue转换为泛型类型

时间:2017-06-01 01:07:46

标签: scala

我试图从json中提取地图数据。

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")
        }
    }
  

找不到类型为Map [K,V]的Json反序列化器。尝试实现一个   此类型的隐式读取或格式。没有足够的论据   方法为:(隐式fjs:play.api.libs.json.Reads [Map [K,V]])Map [K,V]。   未指定的值参数fjs。

当我为Map定义特定类型时,此函数有效(例如:[Map [String,Int]],但不是泛型。我应该怎么做?

1 个答案:

答案 0 :(得分:1)

在某些时候,您必须拥有特定的KV。那时你需要(隐式)范围内的隐式读者,在那之前,你可以隐式地传递它们:

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")
        }
    }

我不知道为什么你会这样设置它。为什么不这样做

(js \ key).as[Map[K,V]] 如果你想要它抛出错误或 (js \ key).asOpt[Map[K,V]] 如果选项也可以。或者,也可能 (js \ key).validate[Map[K,V]]