Дополнительные кавычки вокруг строковых значений JSON, проанализированных с использованием потоков javax.json.stream.JsonParser и Java - PullRequest
1 голос
/ 03 июля 2019

Я анализирую некоторые данные JSON, полученные от вызова службы REST с использованием потоков Java JsonParser.getObjectStream(), и выполняю фильтрацию по определенным значениям, но никогда не получал совпадения, которого я ожидал. Копая глубже, я обнаружил, что возвращаемые строковые значения содержат дополнительные двойные кавычки в начале и конце.

Вот некоторый код для иллюстрации. Сначала я показываю «прямой» метод получения значений, затем метод streams.

package com.company.jsonptest;

import java.io.StringReader;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.stream.JsonParser;

public class GetStringTest {
    public static void main(String[] args) {
        System.out.println("Direct...");
        JsonParser parser = Json.createParser(new StringReader(json));
        parser.next();
        JsonObject jsonObject = parser.getObject().asJsonObject();
        String username = jsonObject.getString("firstname");
        String name = jsonObject.getString("lastname");
        System.out.println("firstname: " + username);
        System.out.println("lastname: " + name);

        System.out.println("Streams...");
        JsonParser parser2 = Json.createParser(new StringReader(json));
        parser2.next();
        parser2.getObjectStream().forEach(entry -> {
            String key = entry.getKey();
            String value = entry.getValue().toString();
            String type = entry.getValue().getValueType().toString();
            System.out.println(key + ": " + value + " (" + type + ")");
        });
    }

    private static String json = "{\n"
        + "  \"firstname\": \"John\",\n"
        + "  \"lastname\": \"Smith\"\n"
        + "}";
}

Вот вывод. Обратите внимание на дополнительные цитаты. Я включил тип JsonValue в качестве дополнительной проверки.

Direct...
firstname: John
lastname: Smith

Streams...
firstname: "John" (STRING)
lastname: "Smith" (STRING)

Есть ли способ обойти это, кроме добавления дополнительного шага для удаления кавычек?

1 Ответ

2 голосов
/ 03 июля 2019

Проблема в том, что getObjectStream() просто перебирает элементы как JsonValue s, что приводит к потере методов ввода, которые JsonObject имеет в вашем первом подходе. Большая разница в том, что вы используете toString() (который просто возвращает json "вещь" за :) вместо getString() (который интерпретирует эту "вещь" как строку).

Чтобы вернуть эту информацию (и методы типа getString()), вы должны привести JsonValue к JsonString

String value = ((JsonString) entry.getValue()).getString();

Это вернет значения без кавычек.


См. Этот Javadoc для примера, где они приводят элемент, который ищут, к JsonArray:

https://static.javadoc.io/javax.json/javax.json-api/1.1.0-M1/javax/json/stream/JsonParser.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...