【问题标题】:Convert nested arbitrary JSON to CSV in Java在 Java 中将嵌套的任意 JSON 转换为 CSV
【发布时间】:2014-09-06 19:41:44
【问题描述】:

这个问题被问了很多次,但我找不到解决我问题的答案。

我正在尝试将嵌套的 JSON 格式转换为 CSV 格式,如下所示:

JSON 结构是任意的,并且可以是任何东西,无论是否嵌套。

我不知道,这是一个数据库答案,我需要将此 JSON 答案导出到 CSV 文件中。

这是一个示例

输入:

   {
    "_id": 1,
    "name": "Aurelia Menendez",
    "scores": [
              {
                 "type": "exam",
                 "score": 60.06045071030959
               },
               {
                 "type": "quiz",
                 "score": 52.79790691903873
               },
               {
                "type": "homework",
                "score": 71.76133439165544
               }
             ]
          }

我正在寻找的输出:

_id,name,scores.type,scores.score,scores.type,scores.score,scores.type,scores.score  
 1,Aurelia Menendez,exam,60.06...,quiz,52.79...,homework,71.76..

这是一个示例,它可以是任何其他 JSON 文档。

这里的想法是在 CSV 列名称中使用点表示法。

我已经使用过 CDL,但输出不是我想要的:

_id scores  name
 1  "[{score:60.06045071030959,type:exam},{score:52.79790691903873,type:quiz},{score:71.76133439165544,type:homework}]" Aurelia Menendez

那么我怎样才能将嵌套的 JSON 转换为带有点符号和通用方式的 CSV 呢?

编辑

使用 Jackson 对 JSON 进行反序列化:

   ObjectMapper mapper=new ObjectMapper();

    JsonNode jsonNode=mapper.readValue(new File("C:\\...\\...\...\\test.json"), JsonNode.class);

伊斯梅尔

【问题讨论】:

  • 你有什么尝试过的吗?
  • CDL 但我不能随意设置参数,所以我可以得到我想要的输出。
  • @Tichodroma,你有没有遇到过我的问题?
  • 您是否考虑过实际编写一些代码? (是的,我知道这样建议是轻率的。)
  • @IsmailSen 我认为 JSON 的形式是有限的。分析您可以从数据库中获取的 JSON 结构的形式,并声明可以反映该结构的 java 类或 java 类。然后使用 GSON 或其他反序列化器来处理这个 json 结构。

标签: java json csv converter


【解决方案1】:

就像你说的:

JSON 结构是任意的,并且可以是任何东西,无论是否嵌套。

JSON 到 CSV 的转换不能一概而论,因为它因用户而异,也取决于特定的要求。

但仍然有一个 json2flat 试图实现它。但它可能与用户的要求不同。还是值得一试的。

例如上面给出的 JSON:

{
    "_id": 1,
    "name": "Aurelia Menendez",
    "scores": [
              {
                 "type": "exam",
                 "score": 60.06045071030959
               },
               {
                 "type": "quiz",
                 "score": 52.79790691903873
               },
               {
                "type": "homework",
                "score": 71.76133439165544
               }
             ]
}

可以解释如下:

/_id,/name,/scores/type,/scores/score
1,"Aurelia Menendez","exam",60.06045071030959
1,"Aurelia Menendez","quiz",52.79790691903873
1,"Aurelia Menendez","homework",71.76133439165544

【讨论】:

  • 假设 JSON 在"scores" : [ … ] 之后包含另一个数组,比如可能是"classes" : [ … ]"societies" : [ … ];你将如何转换它?不要误会我的意思:对于示例数据,您的建议是明智的(并且与其他答案不同),但问题确实指出“JSON 结构是任意的……嵌套”,因此理想情况下,您的想法应该很容易推广。
  • @JonathanLeffler 这一切都取决于用户。他们希望如何解释 json。那么对于 JSON 我这里有另一个示例 ::
  • @JonathanLeffler 这是您所要求的示例:{ "_id": 1, "name": "Aurelia Menendez", "scores": [ { "type": "exam", "score": 60.06045071030959 } ], "classes" : [ { "sub" : "English" } ], "societies" : [ { "socDemo" : "xyz" } ]}。此 JSON 的输出将是 /_id,/name,/scores/type,/scores/score,/classes/sub,/societies/socDemo 1,"Aurelia Menendez","exam",60.06045071030959,, 1,"Aurelia Menendez",,,"English", 1,"Aurelia Menendez",,,,"xyz"
【解决方案2】:

Converting JSON to XLS/CSV in Java 有你要找的东西。

基本上,你需要使用 org.json.CDL 将 JSON 转换为 CSV 格式

【讨论】:

    【解决方案3】:

    评论不方便发布长答案,所以我在这里发布我的答案。

    1. 分析您的 JSON 以及您可以从数据库中获取的所有可能的 JSON 结构。它应该是有限数量的 JSON 表单。

    2. 当您分析了 JSON 结构后,构建了一个类/类层次结构,它完全反映了这种结构。

    3. 根据您的选择使用JSON serializer/deserializer library,将 JSON 反序列化为 java 对象。

    4. 使用 StringBuffer/StringBuilder 类,遍历您的对象信息,并构建逗号分隔(或制表符分隔)的字符串。

    5. 将您在前一阶段构建的字符串写入文件。

    就是这样。

    【讨论】:

    • @IsmailSen 抱歉,但我没有使用 Jackson 框架的经验。\
    • 在第 4 步中,如何迭代分数集合的元素?
    • scores 是对象的集合?实现一个循环,遍历这个集合并使用 StringBuilder 或 StringBuffer 类实例构建一个字符串。
    • 在编辑中,我将 JSON 反序列化为 java 对象jsonNode。当我尝试迭代它时,我得到了Can only iterate over an array or an instance of java.lang.Iterable
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2020-10-28
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多