У меня есть массив 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
Но если значения данных в json состоят из «,», то даже это будет заменено на вкладку. Это приведет к некорректным данным.
@Ruby, вы правы - вам нужен JSON-парсер для анализа входных данных и библиотека csv для записи. Существует множество библиотек для обеих тем, один пример комбинации находится в связанном вопросе.
@Ruby Я предполагаю, что вы сейчас используете stleary.github.io/JSON-java/org/json/CDL.html?
Боюсь, в этой библиотеке нет возможности выбрать другой разделитель.
@Hulk CDL предназначен специально для запятой, он не дает нам возможности изменить разделитель. Я не уверен, какие другие методы я могу попробовать
@Ruby этот связанный вопрос содержит несколько ссылок на библиотеки, которые могут быть полезны.
Вы, вероятно, захотите выбрать стороннюю библиотеку парсера 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();
Возможный дубликат: stackoverflow.com/questions/7172158/…