Преобразование массива JSON в csv с разделителями табуляции в java

У меня есть массив JSON, который выглядит так:

    {
        "Qty": "12",
        "Size": "XL",
        "Colour": "Blue",
        "InSale": "True"
    },
    {   "Qty": "13",
        "Size": "M",
        "Colour": "Green",
        "InSale": "False"}]

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

String csvString = CDL.toString(ProductsJSONArray);
FileUtils.writeStringToFile(file, csvString);

Как я могу добиться этого для строки, разделенной табуляцией? Это результат, который я ожидаю:

Qty Size    Color   InSale
12  XL  Blue    True
13  M   Green   False

Возможный дубликат: stackoverflow.com/questions/7172158/…

donvogel 21.02.2023 08:18

Но если значения данных в json состоят из «,», то даже это будет заменено на вкладку. Это приведет к некорректным данным.

Ruby 21.02.2023 08:36

@Ruby, вы правы - вам нужен JSON-парсер для анализа входных данных и библиотека csv для записи. Существует множество библиотек для обеих тем, один пример комбинации находится в связанном вопросе.

Hulk 21.02.2023 08:46

@Ruby Я предполагаю, что вы сейчас используете stleary.github.io/JSON-java/org/json/CDL.html?

Hulk 21.02.2023 09:02

Боюсь, в этой библиотеке нет возможности выбрать другой разделитель.

Hulk 21.02.2023 09:09

@Hulk CDL предназначен специально для запятой, он не дает нам возможности изменить разделитель. Я не уверен, какие другие методы я могу попробовать

Ruby 21.02.2023 11:01

@Ruby этот связанный вопрос содержит несколько ссылок на библиотеки, которые могут быть полезны.

Hulk 21.02.2023 11:09
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
0
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы, вероятно, захотите выбрать стороннюю библиотеку парсера JSON. Вы можете использовать средство отображения объектов jackson

ObjectMapper objectMapper = new ObjectMapper();
String json = "[{ \"Qty\":\"12\", ... }]";
ArrayNode array = objectMapper.readValue(json, ArrayNode.class);
Set<String> fieldNames = new LinkedHashSet<>();
for (JsonNode node : array) {
   // loop all nodes to get the unique set of fieldNames
   node.fieldNames().forEachRemaining(fieldNames::add);
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println(fieldNames.stream().collect(Collectors.joining("\t"));
for (JsonNode node : array) {
   String csvRow = fieldNames.stream()
      .map(fieldName -> node.has(fieldName) ? node.get(fieldName).asText() : "")
      .collect(Collectors.joining("\t"))
   pw.println(csvRow);
}
String csv = sw.toString();

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