首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson的JSON (2.5.0)验证不像预期的那样工作

Jackson的JSON (2.5.0)验证不像预期的那样工作
EN

Stack Overflow用户
提问于 2015-02-20 15:21:06
回答 1查看 9.1K关注 0票数 3

简单测试用例:

代码语言:javascript
复制
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public static void main(String[] args) throws Exception {
    String json = "1,2";
    ObjectMapper parser = new ObjectMapper();
    JsonNode rootNode = parser.readTree(json);

}

抛出异常:

代码语言:javascript
复制
Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: 
Unexpected character (',' (code 44)): Expected space separating root-level values
at [Source: 1,2; line: 1, column: 3]

这一切都很好,但如果我将String json更改为以下任何一项:

代码语言:javascript
复制
String json = "null,false";
String json = "[1,2,3,null,\"hello\"],false";
String json = "true,3";
String json = "true,{\"test\":3}";

也没有例外。

为什么会有差异?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-20 21:09:23

默认情况下,杰克逊使用ReaderBasedJsonParser,在读取/插入要解析的JSON时,有一个显式检查

代码语言:javascript
复制
switch (i) {
        case '"':
            _tokenIncomplete = true;
            t = JsonToken.VALUE_STRING;
            break;
        case '[':
            if (!inObject) {
                _parsingContext = _parsingContext.createChildArrayContext(_tokenInputRow, _tokenInputCol);
            }
            t = JsonToken.START_ARRAY;
            break;
        case '{':
            if (!inObject) {
                _parsingContext = _parsingContext.createChildObjectContext(_tokenInputRow, _tokenInputCol);
            }
            t = JsonToken.START_OBJECT;
            break;
        case ']':
        case '}':
            // Error: neither is valid at this point; valid closers have
            // been handled earlier
            _reportUnexpectedChar(i, "expected a value");
        case 't':
            _matchTrue();
            t = JsonToken.VALUE_TRUE;
            break;
        case 'f':
            _matchFalse();
            t = JsonToken.VALUE_FALSE;
            break;
        case 'n':
            _matchNull();
            t = JsonToken.VALUE_NULL;
            break;

        case '-':
            /* Should we have separate handling for plus? Although
             * it is not allowed per se, it may be erroneously used,
             * and could be indicate by a more specific error message.
             */
            t = _parseNegNumber();
            break;
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            t = _parsePosNumber(i);
            break;

从上面的代码中可以看到,它检查您提到的字符-空、真、{、[、假等等。如果匹配,它返回有效的json令牌。这就是为什么,如果你改变

代码语言:javascript
复制
String json = "true,3";

代码语言:javascript
复制
String json = "3,true";

它将再次抛出众所周知的异常。

请注意,对于以字母"n“开头的给定字符串也有一个检查,以验证它是否与null匹配(对以"t”、“f”开头的字符串进行相同的检查)。

然后有趣的是_parsePosNumber(i)方法,它基本上调用_reportMissingRootWS来检查根--它显然失败了。

因此,基本上,如果json是有效的,它永远不会到达"failer“的情况,或者如果给定的字符串以"true”、"false“、"null”、"“、"{”、"“、"}”开头,那么它也将被认为是有效的json。

我假设此功能位于Jackson的列表中,因此上述格式被认为是有效的非标准特征

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28632365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档