多维JSON到CSV,非嵌套CSV转换在JAVA中工作
我有一个JSON文件,我需要将其展开并从中创建CSV。我能够转换为CSV(我有一个“用户”包装器),但在“用户”中有另一个名为“标识符”的包装器,我也想迭代它们并为它们创建一个字段 我有一个JSON文件,如下所示:多维JSON到CSV,非嵌套CSV转换在JAVA中工作,java,json,csv,export-to-csv,Java,Json,Csv,Export To Csv,我有一个JSON文件,我需要将其展开并从中创建CSV。我能够转换为CSV(我有一个“用户”包装器),但在“用户”中有另一个名为“标识符”的包装器,我也想迭代它们并为它们创建一个字段 我有一个JSON文件,如下所示: { "users": [ { "displayName": "Sharad Dutta", "givenName": "", "
{
"users": [
{
"displayName": "Sharad Dutta",
"givenName": "",
"surname": "",
"extension_user_type": "user",
"identities": [
{
"signInType": "emailAddress",
"issuerAssignedId": "kkr007@gmail.com"
}
],
"extension_timezone": "VET",
"extension_locale": "en-GB",
"extension_tenant": "EG12345"
},
{
"displayName": "Wayne Rooney",
"givenName": "Wayne",
"surname": "Rooney",
"extension_user_type": "user",
"identities": [
{
"signInType": "userName",
"issuerAssignedId": "kkr007"
}
],
"extension_timezone": "VET",
"extension_locale": "en-GB",
"extension_tenant": "EG12345"
}
]
}
我正在尝试将JSON转换为CSV,这就是我能够做到的:
下面是代码:正如您所看到的,我的JSON被包装在一个“users”类型的包装器中,在JSON中我又有一个包装器“identies”,使用我编写的代码,我可以迭代,但是“identies”将作为JSON blob出现,我想要这样的东西来代替标识
issuerType issuerAssignedId
bla bla bla bla bla bla
而不是标识的JSON嵌套blol
public static void main(String[] args) throws JSONException {
String userJsonFile = "C:\\Users\\Administrator\\Desktop\\jsonRes\\json_format_user_data_input_file.json";
try {
userJsonAsString = readFileAsAString(userJsonFile);
} catch (Exception e1) {
e1.printStackTrace();
}
JSONObject output;
try {
output = new JSONObject(userJsonAsString);
JSONArray docs = output.getJSONArray("users");
File file = new File("C:\\Users\\Administrator\\Desktop\\jsonRes\\EmpDetails.csv");
String csv = CDL.toString(docs);
FileUtils.writeStringToFile(file, csv);
System.out.println("Data has been Sucessfully Writeen to " + file);
System.out.println(csv);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String readFileAsAString(String inputJsonFile) throws Exception {
return new String(Files.readAllBytes(Paths.get(inputJsonFile)));
}
欢迎来到SO!
正如您正确地说的,“标识”是嵌套在“用户”数组的每个元素中的JSON数组。因此,当您扁平化为或多或少的关系格式(此处为CSV)时,通常需要为“identites”数组的每个元素重复其余信息
现在,无论您使用哪个JSON解析库(我假设代码段中的JSONObject来自org.JSON jar?),您都需要迭代JSONArray文档,并为每个元素调用getJSONArray(“标识”)
由于它是一个嵌套数组,因此需要两个循环来处理此场景
“用户”数组的外部循环和“用户”数组的每个元素上的“标识”的嵌套循环
请使用下面的代码片段作为参考。根据您的代码片段编写。请使用标准变量命名和实践。这只是向你展示逻辑
String userJsonAsString="";
StringBuilder sBuild = new StringBuilder();
StringBuilder sBuild2 = new StringBuilder();
try {
userJsonAsString = readFileAsAString(userJsonFile);
} catch (Exception e1) {
e1.printStackTrace();
}
JSONObject output;
try {
output = new JSONObject(userJsonAsString);
JSONArray docs = output.getJSONArray("users");
Iterator<Object> iter = docs.iterator();
while(iter.hasNext()) {
JSONObject userEleObj = (JSONObject)iter.next();
JSONArray nestedIdArray = userEleObj.getJSONArray("identities");
Iterator<Object> nestIter = nestedIdArray.iterator();
while(nestIter.hasNext()) {
JSONObject identityEleObj = (JSONObject)nestIter.next();
identityEleObj.keySet().stream().forEach(key -> sBuild2.append(identityEleObj.get(key)+","));
userEleObj.keySet().stream().forEach(key -> {
if(StringUtils.equals(key, "identities")) {
sBuild.append(sBuild2.toString());
sBuild2.replace(0, sBuild2.length(), "");
} else {
sBuild.append(userEleObj.get(key)+",");
}
});
}
sBuild.replace(sBuild.lastIndexOf(","), sBuild.length(), "\n");
}
System.out.println(sBuild);
} catch (Exception e) {
e.printStackTrace();
}
String userJsonAsString=”“;
StringBuilder sBuild=新建StringBuilder();
StringBuilder sBuild2=新的StringBuilder();
试一试{
userJsonAsString=readfileasasString(userJsonFile);
}捕获(异常e1){
e1.printStackTrace();
}
JSONObject输出;
试一试{
输出=新的JSONObject(userJsonAsString);
JSONArray docs=output.getJSONArray(“用户”);
迭代器iter=docs.Iterator();
while(iter.hasNext()){
JSONObject userEleObj=(JSONObject)iter.next();
JSONArray nesteddarray=userEleObj.getJSONArray(“标识”);
迭代器nesiter=nestedardray.Iterator();
while(nesiter.hasNext()){
JSONObject identityleobj=(JSONObject)nestIter.next();
identityleobj.keySet().stream().forEach(key->sBuild2.append(identityleobj.get(key)+“,”);
userEleObj.keySet().stream().forEach(键->{
if(StringUtils.equals(键,“标识”)){
sBuild.append(sBuild2.toString());
sBuild2.replace(0,sBuild2.length(),“”);
}否则{
sBuild.append(userEleObj.get(key)+“,”);
}
});
}
sBuild.replace(sBuild.lastIndexOf(“,”),sBuild.length(),“\n”);
}
系统输出打印LN(sBuild);
}捕获(例外e){
e、 printStackTrace();
}
首先展平JSON,然后将展平的结构写入CSV:还有更多。很多人使用了第三方库。我在从java库中寻找我可以使用的东西。我不知道,你能推荐一个开始吗?迭代器iter=docs.Iterator();我的IDE显示这不是有效的语法?这里缺少什么吗?对于类型JSONArray-->我得到的结果,方法迭代器()未定义。我认为这是因为我使用的是JSONArray,它是一种外部库。在这种情况下,无论您使用的是什么ext-lib-jar,您都可以用简单的for循环替换迭代器,并实现同样的效果。您将能够使用我的代码片段原样与Java8+和org.json-jar一起作为类路径中的库