未返回整个大型 json 响应
Entire large json response is not returned
我正在尝试使用如下所示的递归 REST 调用来获得较大的 json 响应:
private List<MyPojo> recursiveRestCallMethod(String folderId) throws IOException {
List<MyPojo> mypojoList = new ArrayList<>();
String hugeJson = webClient.get()
.uri("/my/rest/api/accepting/" + folderId
+ "/and/producing/huge/jsonresponse/for/all/files/recursively")
.retrieve().bodyToMono(String.class).block();
byte[] bytes = hugeJson.getBytes("UTF-8");
String json = new String(bytes, StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode node = objectMapper.readValue(json, ObjectNode.class);
objectMapper.configure(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
if (node.get("list").get("entries").isArray()) {
for (JsonNode jsonNode : node.get("list").get("entries")) {
MyPojo pojo = new MyPojo();
JsonNode mainNode = jsonNode.get("entry");
if (mainNode.get("isFile").asBoolean()) {
JsonNode nameNode = mainNode.get("name");
pojo.setNodename(nameNode.toString());
// and 20 more fields
mypojoList.add(pojo);
}
if (mainNode.get("isFolder").asBoolean()) {
mypojoList.addAll(recursiveRestCallMethod(mainNode.get("id").toString().replaceAll("\"", "").trim()));
}
}
return mypojoList;
}
return null;
}
现在每次返回的 json 都有 4193150 个字符,它会抛出异常 - Unexpected end-of-input: expected close marker for Object
据报道 和其他一些 SO 线程(显然,json 不是完整且有效)。
我得到的不完整 json 看起来像:
{"list":{"pagination":{"count":6097,"hasMoreItems":false,"totalItems":6097,"skipCount":0,"maxItems":10000},"entries":[{"entry":{"....
从上面可以看出,我应该得到 6097 个对象,但我只得到 2024 个条目数组项。然后 json 突然结束。即无效的 json 字符串。
然而,对于较小的响应,我有 20/30 个条目数组项,它按预期工作。
注意:我使用的是 Spring-Boot 2.4.5,因此是 Jackson 2.12.4
问题:虽然我使用的是.block()
,为什么响应在4193150个字符处停止?我在这里做错了什么?
不确定使用 String 有什么问题,但是当我切换到 DataBuffer
时,它工作正常。
这是我使用的片段:
final Flux<DataBuffer> hugeJson = webClient.get()
.uri("/my/rest/api/accepting/" + folderId
+ "/and/producing/huge/jsonresponse/for/all/files/recursively")
.accept(MediaType.ALL)
.retrieve()
.bodyToFlux(DataBuffer.class);
我正在尝试使用如下所示的递归 REST 调用来获得较大的 json 响应:
private List<MyPojo> recursiveRestCallMethod(String folderId) throws IOException {
List<MyPojo> mypojoList = new ArrayList<>();
String hugeJson = webClient.get()
.uri("/my/rest/api/accepting/" + folderId
+ "/and/producing/huge/jsonresponse/for/all/files/recursively")
.retrieve().bodyToMono(String.class).block();
byte[] bytes = hugeJson.getBytes("UTF-8");
String json = new String(bytes, StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode node = objectMapper.readValue(json, ObjectNode.class);
objectMapper.configure(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
if (node.get("list").get("entries").isArray()) {
for (JsonNode jsonNode : node.get("list").get("entries")) {
MyPojo pojo = new MyPojo();
JsonNode mainNode = jsonNode.get("entry");
if (mainNode.get("isFile").asBoolean()) {
JsonNode nameNode = mainNode.get("name");
pojo.setNodename(nameNode.toString());
// and 20 more fields
mypojoList.add(pojo);
}
if (mainNode.get("isFolder").asBoolean()) {
mypojoList.addAll(recursiveRestCallMethod(mainNode.get("id").toString().replaceAll("\"", "").trim()));
}
}
return mypojoList;
}
return null;
}
现在每次返回的 json 都有 4193150 个字符,它会抛出异常 - Unexpected end-of-input: expected close marker for Object
据报道
我得到的不完整 json 看起来像:
{"list":{"pagination":{"count":6097,"hasMoreItems":false,"totalItems":6097,"skipCount":0,"maxItems":10000},"entries":[{"entry":{"....
从上面可以看出,我应该得到 6097 个对象,但我只得到 2024 个条目数组项。然后 json 突然结束。即无效的 json 字符串。
然而,对于较小的响应,我有 20/30 个条目数组项,它按预期工作。
注意:我使用的是 Spring-Boot 2.4.5,因此是 Jackson 2.12.4
问题:虽然我使用的是.block()
,为什么响应在4193150个字符处停止?我在这里做错了什么?
不确定使用 String 有什么问题,但是当我切换到 DataBuffer
时,它工作正常。
这是我使用的片段:
final Flux<DataBuffer> hugeJson = webClient.get()
.uri("/my/rest/api/accepting/" + folderId
+ "/and/producing/huge/jsonresponse/for/all/files/recursively")
.accept(MediaType.ALL)
.retrieve()
.bodyToFlux(DataBuffer.class);