首页 > 解决方案 > 如何验证param实际上是Json,而不仅仅是一个字符串

问题描述

我有一个 JsonNode,我接受它作为端点的参数。看起来像这样:

@ApiModelProperty(value = "data", example = "{}", required = true)
@NotNull(message = "data cannot be null")
protected JsonNode data;

我想创建一个名为@ValidJson. JsonNode 本身将确保提供给它的信息是有效的 json,所以如果我传递如下内容:

{"data" = "hello",}, 后面多了一个逗号"hello",会报错。但是我如何确保我没有得到类似"Hello"JsonNode 的东西,因为普通的字符串是有效的 json 表示,所以它是有效的 json?

我一开始想检查字符串是否只是字母数字,如果是,那么我会认为它无效,但显然有人可以传递一个带有符号的字符串,就可以了。我能想到的最好的解决方案是检查第一个和最后一个字符是否分别是{},而 JsonNode 会处理其余的。但我对 的了解不够JsonNode,所以也许这里有人有更好的主意?

编辑:

为了更具体地说明我想要的,这里有几个例子:

JsonNode 将处理不正确的 Json。我想对我输入的数据进行更严格的验证。我不想接收任何类型的 Json,我想要“真实的”、可序列化的 json,当我们说 json 时,我们都指的是。如果用户传递的字符串如下所示:

"Hello" "Hello world" "I'm just a random String that isn't in a key:value structure"

等等,我想抛出一个错误,并要求他们输入格式为 key:value 结构的 Json,例如:

{
   "key": "value"
}

正如我在评论中提到的那样,我正在考虑检查第一个和最后一个字符串值是否分别是{},但我认为这太“hacky”了,也许有更好的方法。

标签: javajacksonspring-validator

解决方案


Jackson 旨在将 JSON 转换为 Java 对象。尽管您的用例可以工作,但它很可能不是很有帮助。看看https://www.baeldung.com/jackson这个教程可以帮助你理解 Jackson 和它的 JSON 转换。

如果你真的想使用 JsonNode,Jackson 会检查它是否是正确的 JSON,否则它会立即抛出异常,因为它无法将其解析为 JsonNode。

如果你想要一个JSON 对象,你可以简单地使用 aMap<String, Object>而不是JsonNode。这将处理键值部分。


推荐阅读