我正在尝试检查json是否有效并且我遇到了一种奇怪的行为。
当我将一些字符附加到可解析的json时,jackson和gson都会解析它并忽略尾随的字符。我想检查json是否严格有效。请帮忙。我在mapper.configure()
尝试了几个标志,但我找不到确切的设置。
import com.google.gson.JsonParser;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
public class JSONUtil {
public static void main(String[] args) {
String jsonStr = "{\"outputValueSchemaFormat\": \"\",\"sortByIndexInRecord\": 0,\"sortOrder\":\"descending\"}opdfahf";
System.out.println(JSONUtil.isValidJson(jsonStr));
}
public static boolean isValidJson(String str) {
try {
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, true);
mapper.readTree(str);
System.out.println(str);
new JsonParser().parse(str);
} catch (Exception e) {
return false;
}
return true;
}
}
PS:这个问题与this不同,因为我使用了相同的代码,但似乎库有一些错误或某些配置标志丢失。我尝试了几个配置标志,但似乎都没有。
答案 0 :(得分:1)
真实世界解析器将其视为接受错误JSON 的功能,前提是他们可以理解。在他们可以轻松修复的错误中(并非所有解析器都可以完成,但有些可以修复一些):
TL / DR:解析器需要接受有效的Json,它只是未指定它对错误但可理解的数据的作用......
恕我直言,如果你想严格验证一个Json字符串,你应该手工构建 一个自定义验证器,控制http://json.org/给出的语法,甚至更好ECMA-404 specification
答案 1 :(得分:0)
如果它可以被ObjectMapper
正确解析,我会说它是有效的JSON ...意思是如果JSON解析器不关心最后一个括号后的尾随字符,你也不应该在意。
但是,如果您仍然关心该特定验证,则可以使用以下内容手动实现它:
char[] chars = str.toCharArray();
int openBrackets = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] != '{' && openBrackets < 1) return false;
if (chars[i] == '{') openBrackets++;
if (chars[i] == '}') openBrackets--;
}
return true;
答案 2 :(得分:0)