繁体   English   中英

如何使用 Python 或 Java 将 CSV 转换为 JSON。csv 表示嵌套的 JSON(包含 json 对象的数组)

[英]how to convert a CSV into JSON using Python Or Java. The csv is representation of a nested JSON (Containing array of json objects and nested objects)

我得到一个 csv 文件,例如:

attrib1_x, attrib1_y, attrib1_z_0_p, attrib1_z_0_c, attrib1_z_1_p, attrib1_z_1_c, attrib2_R, attrib2_K, attrib3

1, 2, 100, 200, 500, 600, 222, 320,你好


csv 代表如下所示的 json。


{
"attrib1":{
           "x":1,
           "y":2,
           "z":[{"p":100,"c":200},{"p":500,"c":600}]
          },
"attrib2":{"R":222,"K":320},
"attrib3":"hello"
}

所以基本上在这里我得到了上面的 CSV,并且需要将它转换为所示的 JSON 结构

. 不知道该怎么做。 是否有任何库(Python/Java)可以帮助我解决这个问题。

如果有不同的 csv header 可用的任何解决方案/建议也将有效。 我可以要求团队为我提供 csv 和不同的 header 名称来表示嵌套的 / arrays。

JSONObject jsonObject = new JSONObject("{
"attrib1":{
           "x":1,
           "y":2,
           "z":[{"p":100,"c":200},{"p":500,"c":600}]
          },
"attrib2":{"R":222,"K":320},
"attrib3":"hello"
}");

试一试。 它可能会有所帮助

首先你迭代key然后类似地迭代value并保存到 csv

  String eol = System.getProperty("line.separator");
                try(Writer writer = new FileWriter("C:\\Users\\m.hussain\\Desktop\\CSV\\testing.csv"))
                {
                    for (Map<String, Object> map : objectRecords)
                    {
                        for (Map.Entry<String, Object> entry : map.entrySet())
                        {
                            writer.append(entry.getKey())
                                    .append(',');
                        }
                        break;
                    }
                    writer.append(eol);
                    for (Map<String, Object> map : objectRecords)
                    {
                        for (Map.Entry<String, Object> entry : map.entrySet())
                        {
                            JSONObject jsonObject;
                            try
                            {
                                jsonObject = new JSONObject(String.valueOf(entry.getValue()));
                                writer.append(jsonObject.getString("value"));
                            }
                            catch (Exception e)
                            {
                                writer.append(String.valueOf(entry.getValue()));
                            }
                            writer.append(',');
                        }
                        writer.append(eol);
                    }

你的CSV第一行是字段名(用下划线表示层级关系),从第二行开始是明细数据,需要把CSV转成JSON格式。 这里的难点是动态解析。 会涉及到分组、递归、循环、条件判断和字符串拼接。 如果您尝试在 Java 中执行此操作,代码将相当冗长。

尝试使用 SPL,即开源 Java package 来执行此操作。 这很简单,五行代码就足够了:在此处输入图像描述

SPL 提供 JDBC 驱动程序,供 Java 调用。只需将上述 SPL 脚本存储为 recurse.splx,然后在调用存储过程时在 Java 应用程序中调用它:

…
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
st = con.prepareCall("call recurse()");
st.execute();
…

使用库Josson构建 JSON 结构。

首先将csv文件header和内容进行拆分,构建一个Map。然后使用function unflatten()进行转换。

LinkedHashMap<String, Object> csv = new LinkedHashMap<>();
csv.put("attrib1_x", 1);
csv.put("attrib1_y", 2);
csv.put("attrib1_z_0_p", 100);
csv.put("attrib1_z_0_c", 200);
csv.put("attrib1_z_1_p", 500);
csv.put("attrib1_z_1_c", 600);
csv.put("attrib2_R", 222);
csv.put("attrib2_K", 320);
csv.put("attrib3", "hello");

Josson josson = Josson.from(csv);
System.out.println(josson.getNode().toPrettyString()); // before unflatten

JsonNode node = josson.getNode("unflatten('_')");
System.out.println(node.toPrettyString()); // after unflatten

Output:展开前

{
  "attrib1_x" : 1,
  "attrib1_y" : 2,
  "attrib1_z_0_p" : 100,
  "attrib1_z_0_c" : 200,
  "attrib1_z_1_p" : 500,
  "attrib1_z_1_c" : 600,
  "attrib2_R" : 222,
  "attrib2_K" : 320,
  "attrib3" : "hello"
}

Output:展开后

{
  "attrib1" : {
    "x" : 1,
    "y" : 2,
    "z" : [ {
      "p" : 100,
      "c" : 200
    }, {
      "p" : 500,
      "c" : 600
    } ]
  },
  "attrib2" : {
    "R" : 222,
    "K" : 320
  },
  "attrib3" : "hello"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM