我正在构建一个测试套件来测试我的 Vert.x API,该 API 实现了几种排序算法。我想介绍的测试用例之一是处理未排序数组中的 null 或空值:
请求正文是我创建的 JSON 字符串,如下所示:
final String json = "{"arr": [99, [2, 4, ], [[55]], 0]}";
目前,我正在使用Vert.x JsonObject和JsonArray解析请求处理程序中的JSON。
import io.vertx.core.json.JsonObject;
import io.vertx.core.json.JsonArray;
private void doBubbleSort(RoutingContext routingContext) {
JsonObject json = routingContext.getBodyAsJson();
JsonArray jsonArray = json.getJsonArray("arr");
....
}
这是我收到的错误
SEVERE: Unexpected exception in route
io.vertx.core.json.DecodeException: Failed to decode:Unexpected character (',' (code 44)): expected a value
at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 49]
at io.vertx.core.json.Json.decodeValue(Json.java:172)
at io.vertx.core.json.JsonObject.fromBuffer(JsonObject.java:960)
at io.vertx.core.json.JsonObject.<init>(JsonObject.java:73)
at io.vertx.ext.web.impl.RoutingContextImpl.getBodyAsJson(RoutingContextImpl.java:263)
at io.vertx.ext.web.impl.RoutingContextDecorator.getBodyAsJson(RoutingContextDecorator.java:123)
at za.co.offerzen.SortVerticle.doBubbleSort(SortVerticle.java:80)
at io.vertx.ext.web.impl.BlockingHandlerDecorator.lambda$handle$0(BlockingHandlerDecorator.java:48)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$2(ContextImpl.java:272)
at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
当 json 中有空值时,如何解析请求?理想情况下,我只想要请求正文中的所有int
值,并忽略或删除空值、null 值或缺失值。在将请求正文解析为 json 之前,我是否需要迭代请求正文,并检查每个值是否instanceof int
?还是有别的办法?
除了JsonObject
和JsonArray
之外,我还可以将请求正文作为Buffer
或String
谢谢。
如果你真的是这样说:
理想情况下,我只想要请求正文中的所有 int 值
您只需执行以下操作:
final String json = "{"arr": [99, [2, 4, ], [[55]], 0]}";
final String regularExpression = "([^\d])+";
Pattern pattern = Pattern.compile(regularExpression);
String[] results = pattern.split(json);
List<Integer> numbers = new ArrayList<>();
for (String result : results) {
try {
numbers.add(Integer.valueOf(result));
} catch (NumberFormatException e) {
}
}
for (int number : numbers) {
System.out.println(number);
}
这将输出:
99
2
4
55
0
但这真的不在乎这是一个 json。它只是从字符串中提取数字。