{
"Employee": [
{
"empMID": "mock:1",
"comments": [],
"col1": "something",
"contact": [{"address":"2400 waterview", "freetext":true}
],
"gender": "male"
},
{
"empMID": "mock:2",
"comments": [],
"col1": "something",
"contact": [{"address":"2200 waterview", "freetext":true}
],
"gender": "female"
}
],
"cola": false,
"colb": false
}
这就是我的Json文件的外观。我需要将这个json转换为csv。(我试图将多维数据转换为2d)。我使用gson作为我的目的。我不能使用gson。 fromgson()函数使用模板对象映射,因为它应该是通用的。
我知道我们可以使用CDL将jsonarray转换为csv格式,但它不适用于我的情况。
我的csv格式看起来像
Employee*
empMID,comment.$,contact.address,contact.freetext,gender
mock:1,,2400 waterview,TRUE,male
mock:123,,2200 waterview,TRUE,female
colA#
TRUE
colB#
FALSE
我尝试使用google-GSON api转换为此格式。但我无法转换为此格式。我使用*表示其json数组,#表示其原始类型和contact.address to在另一个json数组中表示嵌套数组。我有关于这个嵌套结构的问题。我能够像列一样递归遍历所有内容。提前致谢
public static void main(String[] args) throws IOException{
BufferedReader reader=null;
StringBuilder content=null;
String result=null;
reader = new BufferedReader(new FileReader("temp.json"));
String line = null;
content= new StringBuilder();
while ((line = reader.readLine()) != null) {
content.append(line);
}
reader.close();
result= content.toString();
JsonElement jelement = new JsonParser().parse(result);
printJsonRecursive(jelement);
}
public static void printJsonRecursive(JsonElement jelement){
if(jelement.isJsonPrimitive()){
System.out.println(jelement.getAsString());
return;
}
if(jelement.isJsonArray()){
JsonArray jarray= jelement.getAsJsonArray();
for(int i=0;i<jarray.size();i++){
JsonElement element= jarray.get(i);
printJsonRecursive(element);
}
return;
}
JsonObject jobject= jelement.getAsJsonObject();
Set<Entry<String, JsonElement>> set= jobject.entrySet();
for (Entry<String, JsonElement> s : set) {
printJsonRecursive(s.getValue());
}
}
}
答案 0 :(得分:1)
如果您有一个映射到json的对象,则可以通过反射实现此目的。
使用gson / jackson将json转换为java对象
通过迭代类来使用反射追加字段并获取您感兴趣的任何字段。
通过从目标对象获取值来附加反射值。
更多细节请看下面的博文:
vcfvct.wordpress.com/2015/06/30/converting-nested-json-files-to-csv-in-java-with-reflection /
答案 1 :(得分:0)
您没有打印key
。这应该解决它。
for (Entry<String, JsonElement> s : set) {
System.out.println(s.getKey()); //Added
printJsonRecursive(s.getValue());
}
您可以从这里处理\n
。
如果要仅重复打印一次键以重复json对象,请在递归期间创建Java bean
以保存数据和populate it
。 bean完成后,在那里添加一个方法,以所需的格式打印所有数据(仅打印一次键,依此类推)。
答案 2 :(得分:0)
您可以使用库json2flat将 JSON 转换为 CSV 。
此库不需要任何 POJO 。它只是将 JSON作为字符串,并以 List<Object[]>
的格式返回 2D表示。
例如JSON:
{
"Employee": [
{
"empMID": "mock:1",
"comments": [],
"col1": "something",
"contact": [{"address":"2400 waterview", "freetext":true}
],
"gender": "male"
},
{
"empMID": "mock:2",
"comments": [],
"col1": "something",
"contact": [{"address":"2200 waterview", "freetext":true}
],
"gender": "female"
}
],
"cola": false,
"colb": false
}
它给出了一个输出:
/cola,/colb,/Employee/empMID,/Employee/col1,/Employee/gender,/Employee/contact/address,/Employee/contact/freetext
,,"mock:1","something",,"2400 waterview",true
,,"mock:2","something",,"2200 waterview",true
false,false,,,,,
答案 3 :(得分:0)
/**
* Get separated comlumns used a separator (comma, semi column, tab).
*
* @param headers The CSV headers
* @param map Map of key-value pairs contains the header and the value
*
* @return a string composed of columns separated by a specific separator.
*/
private static String getSeperatedColumns(Set<String> headers, Map<String, String> map, String separator) {
List<String> items = new ArrayList<String>();
for (String header : headers) {
String value = map.get(header) == null ? "" : map.get(header).replaceAll("[\\,\\;\\r\\n\\t\\s]+", " ");
items.add(value);
}
return StringUtils.join(items.toArray(), separator);
}