[英]CSV to JSON with Jackson in java, how to make nested objects?
[英]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"
}
. 不知道该怎么做。 是否有任何库(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.