Как удалить лишние экранирующие кавычки JsonObject, созданные с помощью Javax

Я использую javax для создания JsonObject и JsonArray из моего List<String>, и у меня есть список объектов Json, которые я хочу поместить в JsonObject через JsonArray

    JsonArrayBuilder jsonArray = Json.createArrayBuilder(); 
    for (String Obj : listOfJsonDfObjects) 
       jsonArray.add(summaryObj);   //{"a":"b"},{"c":"d"}
   
    // this line introduces extra escaping quotes like this {"\"a\"":"\"b\""},{"\"c\"":"\"d\""}
    javax.json.JsonObject data = Json.createObjectBuilder()
       .add("data", jsonArray.build()).build();  

Как избежать этих дополнительных кавычек, экранирующих символы? Спасибо

Пожалуйста, предоставьте полный минимальный воспроизводимый пример, возможно, даже как неудачный модульный тест, поэтому ваше ожидание находится в коде.

cyberbrain 15.02.2023 20:15

Добавьте код, где вы заполняете свой List<String>

Pepe N O 15.02.2023 20:28

это выходит за рамки этого вопроса, но я показываю пример такого списка: [{"a":"b"},{"c":"d"},..]

Sam 15.02.2023 20:32

Если вы ограничены использованием javax.json API и реализации, вы можете взять каждую строку, такую ​​как {"a":"b"}, и извлечь ее ключ и значение (a и b), используя обычную Java. Затем вы можете использовать JsonObjectBuilder jsonObj = Json.createObjectBuilder() и создать объект JSON из каждого ключа и значения — `jsonObj.add(key, val). Затем добавьте это в свой массив JSON вместо добавления необработанной строки.

andrewJames 15.02.2023 21:45

Или (если вы не ограничены javax) просто используйте библиотеку, которая может анализировать JSON-как-строку непосредственно в объекты и массивы JSON (Jackson, Gson и т. д.).

andrewJames 15.02.2023 21:46

используя Gson, я также заметил дополнительные кавычки. Не могли бы вы показать нам пример Gson?

Sam 15.02.2023 22:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование Гсона

    Gson gson = new Gson();
    String json = gson.toJson(listOfJsonDfObjects);        
    //check json
    System.out.println(json);        
    json = json.replaceAll("\\\\", "");
    json = json.replaceAll("\"\\{", "{");
    json = json.replaceAll("\\}\"", "}");        
    //valid json now
    System.out.println(json);

Более безопасный способ (чтобы избежать изменения исходных данных)

    //concatenate objects in list with comma
    String json = String.join(",", listOfJsonDfObjects);
    //convert to pseudo array
    json = "[" + json + "]"; 
    //convert pseudo json array to pseudo json object
    json = "{\"data\":" + json + "}";
    //cast to json object
    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);                       
    System.out.println(jsonObject);

не опасно ли заменять символы, как вы? вы можете непреднамеренно изменить основные данные json.

Sam 15.02.2023 23:52

Да, это. Я не думаю, что это будет правильно обрабатывать двойные экранированные кавычки или фигурные скобки, если они появляются внутри строковых значений в исходных данных.

Tim Moore 16.02.2023 01:32

Вы правы, я попытаюсь улучшить этот код позже.

Pepe N O 16.02.2023 01:59
Ответ принят как подходящий

Вы говорите, что у вас есть список объектов JSON, но на самом деле у вас есть список строк в формате JSON. Чтобы добавить их в JsonArray, вам нужно проанализировать каждую из них в объектной модели JSON:

public class JsonTest {
    public static void main(String[] args) {
        List<String> listOfJsonDfObjects = List.of(
                "{\"a\":\"b\"}",
                "{\"c\":\"d\"}"
        );
        JsonArrayBuilder jsonArray = Json.createArrayBuilder();
        for (String summaryObj : listOfJsonDfObjects) {
            JsonReader parser = Json.createReader(new StringReader(summaryObj));
            jsonArray.add(parser.readObject());
        }

        JsonObject data = Json.createObjectBuilder()
                .add("data", jsonArray.build()).build();

        System.out.println(data); // {"data":[{"a":"b"},{"c":"d"}]}
    }
}

Другие вопросы по теме