Как читать CSV и анализировать JSON, используя java код - PullRequest
1 голос
/ 04 мая 2020

Я использую следующий код для чтения файла 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 Ответ

2 голосов
/ 04 мая 2020

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


Вставленный вывод означает, что это массив json объектов
[ { "Nutrient" : "Calories", "Amount" : " 289.00", "Unit" : " kcal" }, { "Nutrient" : "Fat", "Amount" : " 17.35", "Unit" : " g" } ]

Ниже JSON на самом деле не имеет смысла, так как нет ключей от объекта. Даже если вы попытаетесь проанализировать этот тип JSON с Джексоном, он выдаст ошибку Исключение в потоке "main" com.faster xml .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" } }


Для по какой-то причине, если вы действительно хотите иметь {} вместо [], просто выполните строковую операцию и замените 1-й "[" на "{" и последний "]" на "}



Отредактировал ответ, чтобы соответствовать отредактированному вопросу: Теперь, когда мы знаем, что ваш 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"));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...