Я использую 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();
Как избежать этих дополнительных кавычек, экранирующих символы? Спасибо
Добавьте код, где вы заполняете свой List<String>
Это выходит за рамки этого вопроса, но я показываю пример такого списка: [{"a":"b"},{"c":"d"},..]
Если вы ограничены использованием javax.json API и реализации, вы можете взять каждую строку, такую как {"a":"b"}, и извлечь ее ключ и значение (a и b), используя обычную Java. Затем вы можете использовать JsonObjectBuilder jsonObj = Json.createObjectBuilder() и создать объект JSON из каждого ключа и значения — `jsonObj.add(key, val). Затем добавьте это в свой массив JSON вместо добавления необработанной строки.
Или (если вы не ограничены javax) просто используйте библиотеку, которая может анализировать JSON-как-строку непосредственно в объекты и массивы JSON (Jackson, Gson и т. д.).
Используя Gson, я также заметил дополнительные кавычки. Не могли бы вы показать нам пример Gson?
Использование Гсона
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.
Да, это. Я не думаю, что это будет правильно обрабатывать двойные экранированные кавычки или фигурные скобки, если они появляются внутри строковых значений в исходных данных.
Вы правы, я попытаюсь улучшить этот код позже.
Вы говорите, что у вас есть список объектов 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"}]}
}
}
Пожалуйста, предоставьте полный минимальный воспроизводимый пример, возможно, даже как неудачный модульный тест, поэтому ваше ожидание находится в коде.