我在How to check whether a given string is valid JSON in Java上找到了一些必须检查JSON是否有效方法,但这些方法不起作用。
public static boolean isJson(String Json) {
Gson gson = new Gson();
try {
gson.fromJson(Json, Object.class);
return true;
} catch (com.google.gson.JsonSyntaxException ex) {
return false;
}
}
如果我用这个方法处理某个字符串,它总是返回true。例如:
System.out.println(renderHtml.isJson("{\"status\": \"UP\"}"));
它给了我true
System.out.println(renderHtml.isJson("bncjbhjfjhj"));
也给了我true
6条答案
按热度按时间z9zf31ra1#
您不应该使用
Gson
来进行这样的验证:Gson
是一个执行 * 反序列化 * 的对象,因此它将 * 整个 * JSON反序列化为内存中的对象。Gson
(我不知道)对于某些无效JSON可能不是很严格:bncjbhjfjhj
被反序列化为java.lang.String
示例。惊喜吧!输出量:
谷歌公司网站首页
类java.lang.String
在这里,您可以使用
JsonReader
逐个读取传入的JSON令牌,从而判断给定的JSON文档在语法上是否有效。然后测试它:
输出量:
真的
假的
qaxu7uf22#
我找到了解决方案,但使用
org.json
库,根据如何检查给定字符串是否为Java中的有效JSON现在随机字符串
bncjbhjfjhj
是false
,{"status": "UP"}
是真。xiozqbni3#
虽然你可能觉得奇怪
确实是有效的json,因为它是一个字符串,并且是它的唯一字符串。
根据不那么新的JSON RFC
JSON文本是一个序列化的值。请注意,某些以前的JSON规范将JSON文本限制为对象或数组。在调用JSON文本的地方只生成对象或数组的实现将是可互操作的,因为所有实现都将接受这些对象或数组作为一致的JSON文本。
eanckbw94#
我很惊讶当
GsonBuilder#setLenient
声明默认情况下,Gson是严格的,只接受RFC 4627指定的JSON。这个选项使解析器可以自由接受。
它看起来是彻头彻尾的谎言,实际上它总是很宽容。而且,甚至任何对
JsonReader.setLenient(false)
的调用都被完全忽略!在浏览了一些与numerous相关的issues和severalrejectedpull请求后,“由于传统的兼容性原因”,我终于找到了具有合理解决方案的https://github.com/google/gson/issues/1208:
JakeWharton于2017年12月15日发表评论
你可以调用getAdapter(type).fromJson(gson.newJsonReader(input))而不是仅仅调用fromJson(input)来获得严格的解析。我们真的应该弃用所有的fromJson方法,并添加默认情况下严格的新版本。
原因是很久以前的错误决定使我们再也无法改变;(
因此,这里是一个纯Gson解决方案,用于严格的json对象解析和大量的测试用例。
请注意,这确保了单个顶级对象。可以将
JsonObject.class
替换为JsonArray.class
或JsonElement.class
,以允许顶级数组或null。上面的代码将JSON解析为
JsonObject
DOM表示。下面的代码使用常规字段Map对自定义POJO进行严格解析。
t5fffqht5#
这对我有用
eivnm1vs6#
如果您只想验证输入是否为有效的JSON,而不使用解析后的JSON数据,那么最简单且可能性能最高的解决方案是:
但是请注意,即使
JsonReader
在非宽松模式下也允许某些根据规范无效的JSON字符串,请参见JsonReader.setLenient(boolean)
的文档,其中列出了这些情况。使用
Gson
或JsonParser
的所有其他解决方案可能无法正常工作,因为这些类在默认情况下是宽松的,并且无法配置此行为。