当前位置: 首页 > 知识库问答 >
问题:

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

张啸
2023-03-14

在使用主体解析器解析将JSON(作为应用程序/JSON内容类型)提交给play framework操作时,我遇到了一个问题。json,其中json包含版权符号。

失败的JSON是:

{
    "Test": "©"
}

返回的错误消息为400,错误请求[无效Json]

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

我使用以下curl命令提交:

Curllocalhost:9001/index-H"内容类型:应用程序/json; charset=UTF-8"-d@失败Json.txt

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

有什么想法吗?

编辑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个答案

翁宜年
2023-03-14

所以,这可能是有争议的——虽然我认为“esttic”在技术上是正确的,但我认为这里有一点灰色地带。因为我们公开了一个公共API,所以我们希望尽可能地宽容。而且,我认为播放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
}

现在,奇怪的是,我怀疑play框架在内部使用了完全相同的机制进行json验证,但是上面的方法可以工作并处理奇怪的字符。这有点像是“踢罐子”,但这正是我们要找的。

巫马泰
2023-03-14

我认为问题是您的故障Json.txt文件没有编码为UTF-8,这是JSON所必需的。我能够通过将您的示例JSON(具有版权字符)编码为ISO-8859-1来重现您的问题。除了将文件重新保存为UTF-8之外,没有其他更改,同样的卷曲请求也很顺利。

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

 类似资料:
  • 基于本文,我尝试创建一个泛型解析器,它将被调用函数的返回值作为字符串输出。 将std::string的std::vector解析为任意类型的std::tuple 不幸的是,我不知道如何格式化一个返回void的函数的返回值······ 在R T::F()上调用Execute时出现错误消息(1),其中R不是void类型: 在空号T::F(args...)上调用Execute时出现错误消息(2)在那里A

  • 我正在尝试刷新从wso2 identity server获得的访问令牌(基于https://docs.wso2.com/display/IS510/Refresh令牌授权);服务器返回无效的授权类型响应 访问令牌是使用openid范围的“授权代码”授权类型获得的。 我已经打开了服务器上的日志记录;然而,我无法确定无效授权类型响应的原因。如何让WSO2 Identity Server使用刷新令牌刷新

  • 我尝试解析时间格式化字符串,现在当我解析字符串“2014-01-07 95:25:37”时,它返回一个日期,而不是抛出ParseException。谁知道如何让它抛出异常。谢谢乔治。 输出:

  • 在改造2中,表示超文本传输协议方法的服务方法必须返回。 是一个泛型,它必须采用表示超文本传输协议方法的返回对象的类型。 例如 对于删除等http方法,不会返回任何内容。在这种情况下,应该为提供什么参数?

  • 我正面临一个前所未有的奇怪问题。我有一个以毫秒为单位的日期,希望将其显示为可读的日期。这是我的代码: 如你所见,我只想创建一个显示时间跨度的字符串。当我调试代码时,日期对象包含正确的值,而

  • 问题内容: 我正在在线关注CS106A的讲座。我正在阅读第12讲中的代码,但这给了我Eclipse错误。 这是我的代码。似乎错误是由于我的方法中的单词void 。我尝试删除main方法,但是没有它,Java当然无法运行。 我是一名新手,没有人解释这东西的真正含义,但有人告诉我,请不要理会它并使用它。如果有人也可以向我解释,我将不胜感激。 这个错误也出现在“ toLower”方法上。不知道这意味着什