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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java中解析具有空值的JSON对象?相关的知识,希望对你有一定的参考价值。

我正在构建一个测试套件来测试我的Vert.x 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值,并忽略或去掉空值,空值或缺失值。在将其解析为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。它只是从字符串中提取数字。

以上是关于如何在Java中解析具有空值的JSON对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何解析具有多个值的 json?

VBScript:将具有空值的参数传递给存储过程?

具有空值的 json_array_elements

在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值

如何使用 Swifty 动态创建具有多个键和值的 json 对象

如何将具有不同值的相同 JSON 对象反序列化为 java 类