如何在 Java 中解析具有空值的 JSON 对象



我正在构建一个测试套件来测试我的 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?还是有别的办法?

除了JsonObjectJsonArray之外,我还可以将请求正文作为BufferString

谢谢。

如果你真的是这样说:

理想情况下,我只想要请求正文中的所有 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。它只是从字符串中提取数字。

相关内容

  • 没有找到相关文章

最新更新