Play Framework 2.2在版权字符上返回“无效的JSON”

时间:2014-02-27 08:26:14

标签: json scala playframework

我在使用body解析器parse.json将jSON(作为application / json内容类型)提交到play框架操作时遇到了一个问题,其中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": "©"
}

2 个答案:

答案 0 :(得分:0)

我认为问题在于您的failingJson.txt文件未编码为UTF-8,这是JSON所必需的。通过将样本JSON(带有版权特征)编码为ISO-8859-1,我能够重现您的问题。除了将文件重新保存为UTF-8之外没有其他任何更改,相同的卷曲请求都很好。

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

答案 1 :(得分:0)

所以,这可能是争论 - 虽然我认为@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验证,但上面的工作和处理奇怪的字符。它有点像“踢罐头”,但却是我们想要的。