Как читать CSV и разбирать JSON с помощью Java-кода
Я использую следующий код для чтения файла CSV и синтаксического анализа его данных в JSON.
File inputFile = new File("in.csv");
File outputFile = new File("out.json");
CsvSchema csvSchema = CsvSchema.builder().setUseHeader(true).build();
CsvMapper csvMapper = new CsvMapper();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
mapper.writerWithDefaultPrettyPrinter().writeValue(outputFile,
csvMapper.readerFor(Map.class).with(csvSchema).readValues(inputFile).readAll());
Это работает нормально и дает мне следующий вывод:
[
{
"Nutrient" : "Calories",
"Amount" : " 289.00",
"Unit" : " kcal"
}, {
"Nutrient" : "Fat",
"Amount" : " 17.35",
"Unit" : " g"
}
]
Но требуемый результат
{
{
"Nutrient" : "Calories",
"Amount" : " 289.00",
"Unit" : " kcal"
}, {
"Nutrient" : "Fat",
"Amount" : " 17.35",
"Unit" : " g"
}
}
На самом деле мне нужно прочитать файлы JSON, которые я преобразовал из CSV. Используя следующий код
String content = Files.readString(filePath);
JSONObject jsonObject1 = new JSONObject(content);
HashMap yourHashMap1 = new Gson().fromJson(jsonObject1.toString(), HashMap.class);
Но пока я пытаюсь это сделать, это дает мне эту ошибку.
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
Между тем файл json должен начинаться с {
вместо того [
и аналогично он должен заканчиваться на }
вместо ]
. Моя цель - убрать эту ошибку.
1 ответ
Я думаю, что результат, который вы видите, правильный, и таким должен быть JSON. JSON - это формат, основанный на ключевом значении.
Вывод, который вы вставили, означает, что это массив объектов json.[
{
"Nutrient" : "Calories",
"Amount" : " 289.00",
"Unit" : " kcal"
}, {
"Nutrient" : "Fat",
"Amount" : " 17.35",
"Unit" : " g"
}
]
Приведенный ниже JSON на самом деле не имеет смысла, так как у объекта нет ключей. Даже если вы попытаетесь разобрать этот тип JSON с помощью Джексона, он выдаст ошибку Исключение в потоке "main" com.fasterxml.jackson.core.JsonParseException: Неожиданный символ ('{' (код 123)): ожидалось двойное- цитата, чтобы начать имя поля с [Source: (String)"{. Вы можете попробовать это
{
{
"Nutrient" : "Calories",
"Amount" : " 289.00",
"Unit" : " kcal"
}, {
"Nutrient" : "Fat",
"Amount" : " 17.35",
"Unit" : " g"
}
}
Другой вариант - рассматривать каждый объект json как уникальный узел с отдельным именем, как показано ниже, см. Ключевые слова set1 и set2{
"set1": {
"Nutrient" : "Calories",
"Amount" : " 289.00",
"Unit" : " kcal"
},
"set2": {
"Nutrient" : "Fat",
"Amount" : " 17.35",
"Unit" : " g"
}
}
По какой-то причине, если вы действительно хотите иметь {} вместо [], просто выполните строковую операцию и замените первую "[" на "{" и последнюю "]" на "}
Отредактировал ответ, чтобы он соответствовал отредактированному вопросу: теперь, когда мы знаем, что ваш JSON представляет собой массив объектов JSON, вы должны читать его как JSONArray вместо JSONObject, также вы больше не можете читать его в хэш-карте, это должен быть список, где каждый элемент в списке будет JSONObject с вашими данными. Фрагмент рабочего кода ниже
String content = Files.readString(filePath);
JSONArray jsonArray = new JSONArray(content);
List<LinkedTreeMap> yourList = new Gson().fromJson(jsonArray.toString(), ArrayList.class);
for(LinkedTreeMap l : yourList) {
System.out.println(l.get("Amount"));
System.out.println(l.get("Nutrient"));
System.out.println(l.get("Unit"));
}