需要将对作为单独的组件传递给Json.obj

时间:2015-05-21 18:42:23

标签: json scala playframework

我使用Scala Play来处理一些JSON。我试过这个:

val pair = ("foo", "bar")
val json = Json.obj(pair)

这给了我

type mismatch;  found   : (String, String)  required: (String, play.api.libs.json.Json.JsValueWrapper)

好的,够公平的。但如果我这样做:

val json = Json.obj(pair._1 -> pair._2)

一切都很好。但我认为x -> y只是(x, y)的语法糖。看起来后面的表达式只是构建一个与原始对象相同并将其传递给Json.obj的新对,但两种情况之间有明显不同。发生了什么事?

1 个答案:

答案 0 :(得分:1)

方法obj采用(String, JsValue)*类型的元组。当您传递(String, String)的元组时,编译器抱怨类型不匹配。 (String, String)(String, JsValue)

不同

现在,来自docs

Most values don’t need to be explicitly wrapped by JsValue classes,
the factory methods use implicit conversion
The Play JSON API provides implicit Writes for most basic types, 
such as Int, Double, String, and Boolean

当您通过String -> String时,编译器有两个选项可以隐式地将String -> String转换为元组(String, String)或从String -> String转换为String -> JsValue转换为元组{{ 1}}。第二个选项匹配(String, JsValue)方法所需的类型,编译器遵循这种方式获得无错误的代码。