如何使用Play 2.3.9将java.util.Map [String,Object]序列化为Scala中的JSON?

时间:2015-10-21 16:12:08

标签: java json scala playframework

我正在使用的客户端库返回java.util.Map[String, Object],我希望能够将其序列化为JSON并让我的端点返回JSON HTTP响应。

我已经尝试将其直接传递给play.api.libs.json.Json.toJson,但是我收到了这个编译错误:

No Json serializer found for type java.util.Map[String,Object]. Try to implement an implicit Writes or Format for this type.

com.google.gson.Gson.toJson似乎处理得很好,但该方法返回一个String,我更喜欢我的端点返回实际的JSON和纯文本字符串。

这是迄今为止我所获得的最好成绩:

def endpoint = Action {
    val myMap: java.util.Map[String, Object] = service.getResponse
    val gsonString: String = new Gson().toJson(myMap)
    Ok(Json.parse(gsonString))
}

但这感觉有点像黑客,因为我基本上是序列化(使用Gson),反序列化(使用Play的Json),然后再次序列化。

我应该坚持我拥有的东西还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

Writes没有隐式Map[String,Object]可用,因为其值类型Writes没有Object可用。类型Object的值可以是Object的任何子类型。它相当于Scala的Any。它的结构在编译时是未知的。 Play的Json序列化仅依赖于编译时已知的信息。

一种解决方案是对类型进行模式匹配,并将其转换为更具体的类型,您可以使用Writes的实例。

另一种方法是简单地使用gson的json字符串输出并使用as结果的Ok方法对其进行渲染,以应用适当的内容类型:Ok(gsonString).as("application/json")