【问题标题】:trailing characters getting parsed in json在 json 中解析的尾随字符
【发布时间】:2016-12-17 20:21:30
【问题描述】:

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

【问题讨论】:

标签: java json


【解决方案1】:

现实世界的解析器将接受不正确的 JSON 视为一项功能只要他们能够理解它。在他们可以轻松修复的错误中(并非所有解析器都能做到,但有些可以修复一些):

  • 不带引号的标识符 => 标识符应该有或没有引号
  • 单引号而不是双引号 => 修复起来很简单
  • 尾随字符 => 解析器可以检测到 Json 字符串的结尾,并且可以忽略后面的任何内容
  • ...

TL/DR:解析器需要接受有效的 Json,它只是未指定它如何处理不正确但可理解的数据...

恕我直言,如果您想严格验证 Json 字符串,您应该手动构建一个自定义验证器,控制http://json.org/ 给出的语法,或者更好的是ECMA-404 specification

【讨论】:

    【解决方案2】:

    在论坛上进行一些研究后,我发现了一个有趣的链接,有人遇到了同样的问题。团队的反应是

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

    请参考问题here

    解决方案请参考here

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2012-06-18
      • 2016-10-24
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多