Java 输入意外结束:应为关闭标记

Java 输入意外结束:应为关闭标记,java,json,jackson,Java,Json,Jackson,我正在尝试使用Jackson v2.9.9流式API解析JSON,并获得以下堆栈跟踪: com.fasterxml.jackson.core.io.JsonEOFException: Unexpected end-of-input: expected close marker for Object (start marker at [Source: (StringReader); line: 1, column: 1]) at [Source: (StringReader); line: 1,

我正在尝试使用Jackson v2.9.9流式API解析JSON,并获得以下堆栈跟踪:

com.fasterxml.jackson.core.io.JsonEOFException: Unexpected end-of-input: expected close marker for Object (start marker at [Source: (StringReader); line: 1, column: 1])
 at [Source: (StringReader); line: 1, column: 8001]
        at com.fasterxml.jackson.core.base.ParserMinimalBase._reportInvalidEOF(ParserMinimalBase.java:618)
        at com.fasterxml.jackson.core.base.ParserBase._handleEOF(ParserBase.java:485)
        at com.fasterxml.jackson.core.base.ParserBase._eofAsNextChar(ParserBase.java:497)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipWSOrEnd(ReaderBasedJsonParser.java:2340)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:656)
我已经将Jackson降级到2.8,但仍然收到错误,验证输入JSON是否有效,并对代码进行空检查

JSON:

代码:

试试看{
JsonFactory工厂=新的JsonFactory();
字符串jsonString=“{\'name\':\'name\',\'score\':100,\'output\':[],\'images\':[],\'description\':\'这是一个描述\'}”;
JsonParser=factory.createParser(jsonString);
JsonToken-nextToken=parser.nextToken();
while(nextToken!=null){
JsonToken token=parser.getCurrentToken();
if(parser.getCurrentName()!=null){
System.out.println(“当前令牌1:+parser.getCurrentName());
}
if(token.equals(JsonToken.FIELD_NAME)){
String fieldName=parser.getCurrentName();
parser.nextToken();
if(parser.getCurrentName()!=null){
System.out.println(“当前令牌2:+parser.getCurrentName());
}
while(parser.nextToken()!=JsonToken.END\u对象){
parser.nextToken();
if(parser.getCurrentName().equals(“name”)){
System.out.println(“名称:”+parser.getValueAsString());
}
}
}
parser.close();
}
}捕获(IOEX异常){
Logger.getLogger(NewIssueExporter.class.getName()).log(Level.SEVERE,null,ex);
}
它在第4行出错:

while(nextToken!=null){

我希望打印所有调试消息,但在出现错误后不会打印。

当您解析有效的
JSON
时,您需要像对待状态机一样考虑它。您找到了name-它意味着:下一个将是值,等等。您可以将代码简化为:

JsonFactory factory = new JsonFactory();
String jsonString = "{\"name\":\"name\", \"score\":100, \"output\":[1,2],\"images\":[\"image1\",\"image2\"],\"description\":\"This is a description\"}";
JsonParser parser = factory.createParser(jsonString);
JsonToken token;
while ((token = parser.nextToken()) != JsonToken.END_OBJECT) {
    if (token == JsonToken.FIELD_NAME) {
        // Found name, lets read value
        System.out.print(parser.getCurrentName() + " = ");
        token = parser.nextToken();
        if (token == JsonToken.VALUE_STRING) {
            System.out.println(parser.getValueAsString());
        } else if (token == JsonToken.VALUE_NUMBER_INT) {
            System.out.println(parser.getValueAsInt());
        } else if (token == JsonToken.START_ARRAY) {
            // Found start array, lets read it all
            System.out.print("[");
            while (parser.nextToken() != JsonToken.END_ARRAY) {
                System.out.print(parser.getText() + ", ");
            }
            System.out.println("]");
        }
    }
}
parser.close();
另见:


你确定你的行是正确的吗?我不知道空检查怎么可能抛出
JsonEOFException
@azurefrog是的,我在代码中运行了断点,不幸的是它在那行中断了。可能最好在while循环中只获取一个令牌,然后对其进行解析。@azurefrog我的错了。我修复了代码。JSON已被修改,因为原始版本是专有的,但仍然具有相同的结构。我发现代码有点混乱。您一直在调用nextToken,但从未更新nextToken值,因此我并不奇怪您会遇到问题。这是一种奇怪的json解析方法。
JsonFactory factory = new JsonFactory();
String jsonString = "{\"name\":\"name\", \"score\":100, \"output\":[1,2],\"images\":[\"image1\",\"image2\"],\"description\":\"This is a description\"}";
JsonParser parser = factory.createParser(jsonString);
JsonToken token;
while ((token = parser.nextToken()) != JsonToken.END_OBJECT) {
    if (token == JsonToken.FIELD_NAME) {
        // Found name, lets read value
        System.out.print(parser.getCurrentName() + " = ");
        token = parser.nextToken();
        if (token == JsonToken.VALUE_STRING) {
            System.out.println(parser.getValueAsString());
        } else if (token == JsonToken.VALUE_NUMBER_INT) {
            System.out.println(parser.getValueAsInt());
        } else if (token == JsonToken.START_ARRAY) {
            // Found start array, lets read it all
            System.out.print("[");
            while (parser.nextToken() != JsonToken.END_ARRAY) {
                System.out.print(parser.getText() + ", ");
            }
            System.out.println("]");
        }
    }
}
parser.close();