Json.obj Scala,string concat:编译错误

时间:2017-08-02 15:43:35

标签: java json string scala playframework

我试图在Scala中尝试下一个,我使用的是play2:

val str = "another"
val r = Json.obj("error_type" -> "invalid_request_error",
            "validation_errors" -> (Json.obj(
              "code" -> "this mode " + str + " does not exist",
              "param" -> "mode"
            )))

但它给了我错误:

Type mismatch, expected: (String, Json.JsValueWrapper), actual: String

但如果我这样做:

val r = Json.obj("error_type" -> "invalid_request_error",
            "validation_errors" -> (Json.obj(
              ("this mode ".+(str)).+(" does not exist"),
              "param" -> "mode"
            ))))

它编译和工作......

如何以str1 + str2 + str3的形式编写它更具可读性?订单/优先顺序如何相关?在我的回答中,我不明白为什么()不需要评论。当需要括号时是否还有其他类似的情况?

ps:我不确定Java中是否存在同样的问题

3 个答案:

答案 0 :(得分:5)

通过查看运算符优先级可以很容易地解释这一点。

从语言参考http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#infix-operations,我们可以看到运算符+->具有相同的优先级。这是因为,通常,它是运算符的第一个字符,用于确定其优先级。在我们的示例中,第一个字符是+-,它们都具有相同的优先级。

因此,写"code" -> "this mode " + str + " does not exist"与写作相同:

"code"
  .->("this mode ")
  .+(str)
  .+(" does not exist")

这与编译器告诉你的内容一致:

  • 第一个操作("code" -> "this mode ")的结果类型为(String, String),相当于Tuple2[String, String]
  • (String, String) + String会触发对元组的隐式toString()转换,因此生成的类型为String

您似乎已经找到了以更易读的方式对其进行格式化的更好方法。

至于其他情况是需要括号,显而易见的答案是,一旦你不想要运算符优先级给你的行为,你就需要它们。因此,我强烈建议阅读上面链接的规范的第6.12章!

答案 1 :(得分:1)

最后我能做到,但我不知道原因,我知道,请让我知道:

我用()悲伤的字符串,它编译和工作就像一个魅力:

"code" -> ("payment mode " + another + " does not exist"), ...
总之,它将是:

Json.obj("error_type" -> "invalid_request_error",
                      "validation_errors" -> (Json.obj(
                        "code" -> ("payment mode " + another + " does not exist"),
                        "param" -> "payment_mode"
                      ))))

答案 2 :(得分:-2)

您可以在StringSeq[String]的地图中创建错误消息,然后将其转换为Json。我认为这是最好的方法。