java - 意外的输入结束:预期的关闭标记
问题描述
我正在尝试使用 Jackson v2.9.9 Streaming 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:
{"name":"name", "score":100, "output":[],"images":[],"description":"This is a description"}
代码:
try {
JsonFactory factory = new JsonFactory();
String jsonString = "{\"name\":\"name\", \"score\":100, \"output\":[],\"images\":[],\"description\":\"This is a description\"}";
JsonParser parser = factory.createParser(jsonString);
JsonToken nextToken = parser.nextToken();
while (nextToken != null) {
JsonToken token = parser.getCurrentToken();
if (parser.getCurrentName() != null) {
System.out.println("Current Token 1: " + parser.getCurrentName());
}
if (token.equals(JsonToken.FIELD_NAME)) {
String fieldName = parser.getCurrentName();
parser.nextToken();
if (parser.getCurrentName() != null) {
System.out.println("Current Token 2: " + parser.getCurrentName());
}
while (parser.nextToken() != JsonToken.END_OBJECT) {
parser.nextToken();
if (parser.getCurrentName().equals("name")) {
System.out.println("Name: " + parser.getValueAsString());
}
}
}
parser.close();
}
} catch (IOException ex) {
Logger.getLogger(NewIssueExporter.class.getName()).log(Level.SEVERE, null, ex);
}
它在第 4 行出错:
while(nextToken != null) {
我希望所有调试消息都能打印出来,但在出错之后它们不会。
解决方案
当您解析有效时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();
也可以看看:
推荐阅读
- elasticsearch - KIBANA 和 ELASTICSEARCH 配置 CA
- html - 响应式进度条垂直对齐
- chef-infra - 如何在测试厨房的节点上启用特定的 Ohai 插件
- mysql - 检查日期可用性的子查询
- c++ - 使用 Conan 直接从 GitHub 安装包
- omnet++ - 如何将 'const omnetpp::SimTime' 转换为 'double'
- dialogflow-es - 在荷兰测试 Actions on Google Transaction API 时出现“抱歉,我无法在您所在地区收款”消息
- aurelia - 在转发器中使用 @computedFrom 数组
- r - 具有灵活函数参数的复杂 if else 函数的代码改进
- c# - .NET Framework 依赖树