【问题标题】:scala - play json JsValue conver to generic typescala - 播放 json JsValue 转换为泛型类型
【发布时间】:2017-06-01 01:07:46
【问题描述】:

我试图从 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 定义特定类型时,此函数有效(例如:v.as[ Map[String, Int]],但不是泛型。我应该如何处理它?

【问题讨论】:

    标签: scala


    【解决方案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]]

    【讨论】:

    • 谢谢你救了我:)
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多