多维 JSON 到 CSV,在 JAVA 中工作的非嵌套 CSV 转换
Multidimentional JSON to CSV , non-nested CSV convertion working in JAVA
我有一个 JSON 文件,我需要将其压缩并从中创建一个 CSV。我能够转换为 CSV(我有一个“用户”包装器)但在“用户”内部有另一个名为“标识符”的包装器,我也想迭代它们并为它们创建一个字段。
我有一个 JSON 文件,如下所示:
{
"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 我有另一个包装器 "identities",使用我所做的代码,我能够迭代,但是 "identites" 出现 JSON blob,我想要这样的东西来代替 identites
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!
正如您所说的那样,“identities”是一个嵌套的 JSON 数组,位于“users”数组的每个元素中。因此,当您扁平化为 more-or-less 关系格式(此处为 CSV)时,您通常需要为“identitites”数组的每个元素重复其余信息。
现在,无论您使用哪个 JSON 解析库(JSON您片段中的对象,我假设来自 org.json jar?),您需要遍历JSON数组文档并为每个元素调用 getJSONArray("identities")。
由于它是嵌套数组,因此您需要两个循环来处理这种情况。
“users”数组的外循环和“users”数组每个元素上“identities”的嵌套循环。
请仅将以下代码段用作参考。根据您的代码片段编写。请使用标准的变量命名和惯例。这只是为了向您展示逻辑
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();
}
我有一个 JSON 文件,我需要将其压缩并从中创建一个 CSV。我能够转换为 CSV(我有一个“用户”包装器)但在“用户”内部有另一个名为“标识符”的包装器,我也想迭代它们并为它们创建一个字段。
我有一个 JSON 文件,如下所示:
{
"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 我有另一个包装器 "identities",使用我所做的代码,我能够迭代,但是 "identites" 出现 JSON blob,我想要这样的东西来代替 identites
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! 正如您所说的那样,“identities”是一个嵌套的 JSON 数组,位于“users”数组的每个元素中。因此,当您扁平化为 more-or-less 关系格式(此处为 CSV)时,您通常需要为“identitites”数组的每个元素重复其余信息。
现在,无论您使用哪个 JSON 解析库(JSON您片段中的对象,我假设来自 org.json jar?),您需要遍历JSON数组文档并为每个元素调用 getJSONArray("identities")。
由于它是嵌套数组,因此您需要两个循环来处理这种情况。
“users”数组的外循环和“users”数组每个元素上“identities”的嵌套循环。
请仅将以下代码段用作参考。根据您的代码片段编写。请使用标准的变量命名和惯例。这只是为了向您展示逻辑
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();
}