【问题标题】:Json.obj Scala, string concat: Compilation errorJson.obj Scala,字符串连接:编译错误
【发布时间】:2018-01-09 22:41:48
【问题描述】:

我正在尝试在 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 中是否是同样的问题

【问题讨论】:

    标签: java json string scala playframework


    【解决方案1】:

    这很容易通过查看运算符优先级来解释。

    从语言参考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 章!

    【讨论】:

    • 非常感谢 Federic!真的很棒的答案:),我肯定会接受
    【解决方案2】:

    我终于可以做到了,但我不知道原因,我有人知道,请告诉我:

    我用 () 对字符串感到悲伤,它编译并像魅力一样工作:

    "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"
                          ))))
    

    【讨论】:

    • 这显然是算子申请顺序/优先级
    • @cchantep 我更新了答案,如果你想再看一遍
    【解决方案3】:

    您可以在 <code>String</code><code>Seq[String]</code> 的映射中创建错误消息,然后将它们转换为 Json。我认为这是最好的方法。

    【讨论】:

    • 这不是我问的:D
    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 2021-11-18
    • 2013-06-25
    • 2011-08-17
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多