Java 如何验证param实际上是Json,而不仅仅是字符串

Java 如何验证param实际上是Json,而不仅仅是字符串,java,jackson,spring-validator,Java,Jackson,Spring Validator,我有一个JsonNode,我接受它作为端点的参数。看起来像这样: @ApiModelProperty(value = "data", example = "{}", required = true) @NotNull(message = "data cannot be null") protected JsonNode data; 我想创建一个名为@ValidJson的验证器。JsonNode本身将确保提供给它的信息是有效的json,因此如果我传递如下内容: {“data”=“hello”,}

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

@ApiModelProperty(value = "data", example = "{}", required = true)
@NotNull(message = "data cannot be null")
protected JsonNode data;
我想创建一个名为
@ValidJson
的验证器。JsonNode本身将确保提供给它的信息是有效的json,因此如果我传递如下内容:

{“data”=“hello”,}
,如果在
“hello”
后面有一个额外的逗号,它将抛出一个错误。但是如何确保我没有得到类似于JsonNode的
“Hello”
,这是有效的json,因为普通字符串是有效的json表示

我首先考虑的是字符串是否只是字母数字,如果是,那么我认为它是无效的,但是显然有人可以通过一个带符号的字符串,这样就可以了。我能想到的最佳解决方案是检查第一个字符和最后一个字符是否分别为
{
}
,其余的由JsonNode处理。但是我对JsonNode的了解还不够,所以这里有人有更好的主意吗

编辑:

更具体地说,我想要的是以下几个例子:

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

“你好”
“你好,世界”
“我只是一个不在key:value结构中的随机字符串”

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

{
   "key": "value"
}

正如我在评论中提到的,我想检查第一个和最后一个字符串值是否分别为
{
}
,但我认为这太“黑”,可能有更好的方法

Jackson的设计目的是将JSON转换为Java对象。尽管您的用例可以工作,但它很可能没有多大帮助。阅读本教程可能会帮助您了解Jackson及其JSON转换

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


如果您想要一个JSON对象,您可以简单地使用
Map
而不是JsonNode。这将处理键值部分。

正如@VinceEmigh在评论中指出的那样,
isObject
是我一直在寻找的函数

json作为一个查询参数似乎有点不合适。你是什么意思?你必须以某种方式向帖子发送数据。。。有json是很标准的吗?它应该抛出一个错误,因为这不是有效的json。但是,如果只允许JSON对象,为什么要将其定义为通用节点?
JsonNode
has,以及其他验证方法,如
isArray()
isNumeric()
isTextual()
。这就是你要找的吗?没问题。只要确保在您有问题时随时查看JavaDocs(或者在某些情况下,当您的问题不涉及任何特定的引用类型时)。您不仅可以更快地获得解决方案,而且还可以获得一些更深入的见解,这些见解在将来会很有用。是的,但我如何检查它的实际Json,而不是,比方说,仅仅是一个字符串?如果您将“Hello”传递给JsonNode,它将正常工作。“Hello”是一个绝对正确的JSON字符串。因此,我真的建议您看看教程,了解Jackson是如何工作的,以及您如何期望得到您真正期望的JSON。你有什么特别的建议吗?好像你知道一些我不知道的事情。你能和我们分享吗?如果你能告诉我们你想从你的客户那里得到哪些数据,我很乐意帮助你。但是如果你不提供更多的信息,我帮不了你。最好的方法可能是,如果您向我们展示您期望的json,那么我的检查不会像断言json节点
data.equalTo({“name”:“test”,“country”:“france”})
,但更像是{“name”:“test”…}在“key:value”对中的json。所以“你好”不是那种格式,所以它是不正确的。