Как я могу разобрать объект JSON с пустым значением в Java? - PullRequest
0 голосов
/ 03 января 2019

Я создаю набор тестов для тестирования моего Vert.x API, который реализует несколько алгоритмов сортировки.Один из тестовых примеров, который я хотел бы охватить, заключается в обработке нулевых или пустых значений в несортированном массиве:

Тело запроса представляет собой строку JSON, которую я создаю следующим образом:

final String json = "{\"arr\": [99, [2, 4, ], [[55]], 0]}";

В настоящее время я анализирую JSON в обработчике запросов, используя Vert.x JsonObject и JsonArray.

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?Или есть другой способ?

Помимо JsonObject и JsonArray, я могу получить тело запроса в виде Buffer или String

Спасибо.

1 Ответ

0 голосов
/ 03 января 2019

Если вы действительно имеете в виду, что:

в идеале, я хочу получить только все значения 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.Это просто извлечение чисел из строки.

...