1

我正在使用以下代码读取 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"
}
}

实际上,我需要阅读从 CSV 转换而来的 JSON 文件。使用以下代码

             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 文件应该以{代替开头,[类似地它应该以}代替结尾]。我的目标是消除这个错误。

4

1 回答 1

2

我认为您看到的结果是正确的,这就是 JSON 应该的方式。JSON 是一种基于键值的格式。


您粘贴的输出只是意味着它是一个 json 对象数组
[ { "Nutrient" : "Calories", "Amount" : " 289.00", "Unit" : " kcal" }, { "Nutrient" : "Fat", "Amount" : " 17.35", "Unit" : " g" } ]

下面的 JSON 实际上没有意义,因为该对象没有键。即使您尝试使用 Jackson 解析这种 JSON,它也会在线程 "main" com.fasterxml.jackson.core.JsonParseException: Unexpected character ('{' (code 123)): was Expecting double-引用在 [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"));
    }
于 2020-05-03T23:26:07.470 回答