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

amrnrhlw  于 2022-12-06  发布在  Python
关注(0)|答案(4)|浏览(169)

我得到一个csv文件,如下所示:
属性1_x,属性1_y,属性1_z_0_p,属性1_z_0_c,属性1_z_1_p,属性1_z_1_c,属性2_R,属性2_K,属性3
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标题可用,也将工作。我可以要求团队提供我的csv与不同的标题名称,以表示嵌套/数组。

snvhrwxg

snvhrwxg1#

首先迭代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);
                    }
roejwanj

roejwanj2#

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"
}");

试试看吧,也许会有帮助

svdrlsy4

svdrlsy43#

CSV的第一行包含字段名(用下划线表示层次关系),详细数据从第二行开始,需要将CSV转换为JSON格式。这里的难点是动态解析。它将涉及分组、递归、循环、条件判断和字符串连接。如果用Java来做这些,代码会相当长。
尝试使用SPL(开源Java包)来实现这一点。它很简单,5行代码就足够了:enter image description here
SPL提供了Java调用的JDBC驱动程序,只需将上面的SPL脚本存储为recurse.splx,并在调用存储过程时在Java应用程序中调用它即可:

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

hc8w905p4#

使用库 Josson 构建JSON结构。
首先将csv文件头和内容拆分,建立Map,然后使用函数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

输出:取消展平前

{
  "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"
}

输出:展平后

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

相关问题