尾随字符在json中被解析

时间:2016-08-11 07:57:48

标签: java json

我正在尝试检查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不同,因为我使用了相同的代码,但似乎库有一些错误或某些配置标志丢失。我尝试了几个配置标志,但似乎都没有。

3 个答案:

答案 0 :(得分:1)

真实世界解析器将其视为接受错误JSON 的功能,前提是他们可以理解。在他们可以轻松修复的错误中(并非所有解析器都可以完成,但有些可以修复一些):

  • 不带引号的标识符=>标识符应该带有或不带引号
  • 单引号而不是双引号=>微不足道的修复
  • 尾随字符=>解析器可以检测到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)

经过对论坛的一些研究后,我发现一个有趣的链接,有人遇到同样的问题。团队的回应是

  

是。这是设计的。如果你想捕获这些问题,你需要构建JsonParser,手动推进它。多个根级别值的存在不被视为有效性问题,但在您的情况下,将捕获没有匹配']'的流末尾。

请参阅问题here

有关解决方案,请参阅here