【问题标题】:Play Framework 2.2 Returns "Invalid JSON" On Copyright CharacterPlay Framework 2.2 在版权字符上返回“无效 JSON”
【发布时间】:2014-02-27 08:26:14
【问题描述】:

在使用正文解析器 parse.json 将 JSON(作为应用程序/json 内容类型)提交到播放框架操作时遇到问题,其中 JSON 包含版权符号。

失败的 JSON 是:

{
    "Test": "©"
}

返回的错误信息是400,Bad Request [Invalid Json]

我相信这应该可行,我检查过的所有 JSON 验证器都说这应该是有效的 JSON。有没有办法调试/跟踪正在崩溃的游戏,或者有人有什么想法吗?我的下一步是在客户端对其进行 HTML 编码,但我认为这不是必需的,而且我担心将来会导致兼容性问题(因为这似乎是有效的)。

我正在使用以下 curl 命令提交:

curl localhost:9001/index -H "Content-Type:application/json;charset=UTF-8" -d @failingJson.txt

注意:我重新尝试(为了重现性)将其直接从网站复制到 txt 文件并提交,同样的问题。这有可能与一些无法识别的 UTF-8 字符有关,但有没有办法真正找出 Play 崩溃的原因?

另外,它在我的代码之前就已经崩溃了,它在框架中的某个地方。

有什么想法吗?

编辑 1:

实际使用的是 Play 2.2,而不是 Play 2.1

编辑 2: 这基本上是控制器的样子:

def addItem() = Action.async(parse.json) { request =>
    //Do Stuff
}

还有路线:

POST    /index                      controllers.IndexController.addItem()

编辑 3: 而且,为了超级清楚,这很好用:

{
    "Test": "©"
}

【问题讨论】:

  • 嗯,您提供的 json 没有出现此错误。您是否尝试将 Content-Type 标头更改为 application/json;charset=UTF-8
  • 是的,我正在使用 playframework 2.2,但我不知道这是否重要
  • 您如何发送测试 JSON 请求?如果您发布更多代码可能会有所帮助。
  • 是的,很好,我会添加一些细节

标签: json scala playframework


【解决方案1】:

我认为问题在于您的 failingJson.txt 文件未编码为 JSON 所需的 UTF-8。通过将您的示例 JSON(带有版权字符)编码为 ISO-8859-1,我能够重现您的问题。除了将文件重新保存为 UTF-8 之外没有其他任何更改,相同的 curl 请求顺利通过。

基本上,您的应用可能运行良好,您只需要确保您的数据文件编码正确。

【讨论】:

    【解决方案2】:

    所以,这可能是争论 - 虽然我认为 @estmatic 在技术上是正确的,但我认为这里有一些灰色区域。由于我们公开了一个公共 API,我们希望尽可能地宽容。而且,我认为 Play JSON 验证器太严格了。我们解决此问题的方法可能适用于有类似问题的人,即使用原始正文解析器并在控制器级别进行解析。

    def addItem() = Action.async(parse.raw) { request =>
        val s = new String(request.body.asBytes().get)
        val jsBody = Json.parse(s)
        val jsonResult = Json.fromJson[Entity](jsBody)
        val entity = jsonResult.get
    }
    

    现在,奇怪的部分是我怀疑播放框架在内部使用完全相同的机制进行 json 验证,但上面的工作并处理了奇怪的字符。它有点像“踢罐子”,但正是我们正在寻找的。​​p>

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多