我正在使用的客户端库返回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),然后再次序列化。
我应该坚持我拥有的东西还是有更好的方法来做到这一点?
答案 0 :(得分:1)
Writes
没有隐式Map[String,Object]
可用,因为其值类型Writes
没有Object
可用。类型Object
的值可以是Object
的任何子类型。它相当于Scala的Any
。它的结构在编译时是未知的。 Play的Json序列化仅依赖于编译时已知的信息。
一种解决方案是对类型进行模式匹配,并将其转换为更具体的类型,您可以使用Writes
的实例。
另一种方法是简单地使用gson的json字符串输出并使用as
结果的Ok
方法对其进行渲染,以应用适当的内容类型:Ok(gsonString).as("application/json")
。