2014-02-27 34 views
2

我在将JSON(作为应用程序/ json内容类型)提交到具有body parser parse.json的播放框架操作时遇到问题,其中JSON包含版权符号。Play Framework 2.2在版权角色返回“无效JSON”

的失败JSON是:

{ 
    "Test": "©" 
} 

返回的错误信息是400错误的请求[无效的Json]

我相信这应该工作,所有的JSON我检查验证说这应该是有效的JSON。有没有一种方法可以调试/追踪哪些游戏正在崩溃,或者有没有人有任何想法?我的下一步是在客户端对HTML进行编码,但我不认为这是需要的,我担心将来会导致兼容性问题(因为这似乎是有效的)。

我使用以下卷曲命令提交:

卷曲本地主机:9001 /索引-H “内容类型:应用/ JSON;字符集= UTF-8” -d @ failingJson.txt

注:我重新尝试(为了可复制性)直接从网站复制到txt文件并提交相同的问题。这有可能与一些无法识别的UTF-8字符有关,但是有什么方法可以真正找出为什么Play会崩溃吗?

另外,在碰到我的代码之前,它已经崩溃了,它在框架中的某处。

任何想法?

编辑1:

实际使用播放2.2,不张扬2.1

编辑2: 这里的基本控制器是什么样子:

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

和路由:

POST /index      controllers.IndexController.addItem() 

编辑3: 而且,只是为了b Ë超清晰,能正常工作:

{ 
    "Test": "©" 
} 
+1

嗯,我没有得到你提供的json的这个错误。你有没有尝试将你的'Content-Type'头改为'application/json; charset = UTF-8'? – serejja

+0

是的,我使用playframework 2.2,但我不知道如果这很重要 – serejja

+0

你怎么发送你的测试JSON请求?如果你发布了更多的代码,这可能会有所帮助。 – estmatic

回答

0

我认为问题是,你的failingJson.txt文件不被编码为UTF-8,这是需要的JSON。我能够通过编码您的示例JSON(具有版权字符)作为ISO-8859-1来重现您的问题。除了将文件重新保存为UTF-8以外,没有任何更改,相同的curl请求通过罚款。

基本上,你的应用程序可能工作正常,你只需要确保你的数据文件编码正确。

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验证,但上述工程并处理怪异字符。它有点像“把罐子踢出去”,但是我们正在寻找。