在java中将嵌套Json文件转换为CSV

在java中将嵌套Json文件转换为CSV,java,json,csv,gson,Java,Json,Csv,Gson,这就是我的Json文件的外观。我需要将此Json转换为csv。(我正在尝试将多维数据转换为2d)。我使用gson是出于我的目的。我不能使用gson.fromgson()函数将对象映射到模板,因为它应该是通用的 我知道我们可以使用CDL将jsonarray转换为csv格式,但在我的情况下它不起作用 我的csv格式看起来像 { "Employee": [ { "empMID": "mock:1", "comments":

这就是我的Json文件的外观。我需要将此Json转换为csv。(我正在尝试将多维数据转换为2d)。我使用gson是出于我的目的。我不能使用gson.fromgson()函数将对象映射到模板,因为它应该是通用的

我知道我们可以使用CDL将jsonarray转换为csv格式,但在我的情况下它不起作用

我的csv格式看起来像

    {
    "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
}
我尝试使用google GSON api转换为此格式。但我无法转换为此格式。我使用*表示其json数组,使用#表示其原始类型,使用contact.address表示另一个json数组中的嵌套数组。我在关联此嵌套结构时遇到问题。我能够遍历所有内容像列一样递归。提前谢谢

Employee*
empMID,comment.$,contact.address,contact.freetext,gender
mock:1,,2400 waterview,TRUE,male
mock:123,,2200 waterview,TRUE,female
colA#
TRUE
colB#
FALSE
publicstaticvoidmain(字符串[]args)引发IOException{
BufferedReader reader=null;
StringBuilder内容=null;
字符串结果=null;
reader=newbufferedreader(newfilereader(“temp.json”);
字符串行=null;
内容=新的StringBuilder();
而((line=reader.readLine())!=null){
内容。追加(行);
}
reader.close();
结果=content.toString();
JsonElement-jelement=new-JsonParser().parse(结果);
printJsonRecursive(jelement);
}
公共静态void printJsonRecursive(JsonElement-JeElement){
if(jelement.isJsonPrimitive()){
System.out.println(jeelement.getAsString());
返回;
}
if(jelement.isJsonArray()){
JsonArray jarray=jeelement.getAsJsonArray();

对于(int i=0;i您没有打印
键。这应该可以解决它

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());


        }

    }



}
for(条目s:set){
System.out.println(s.getKey());//已添加
printJsonRecursive(s.getValue());
}
您可以从这里处理
\n
s

编辑
如果您想为重复的json对象只打印一次键,请创建一个
JavaBean
来保存数据,并在递归期间
填充它。一旦bean完成,在那里添加一个方法,以您想要的格式打印所有数据(只打印一次键,依此类推).

如果您有一个映射到json的对象,则可以通过反射来实现这一点

  • 使用gson/jackson将json转换为java对象

  • 通过迭代类来使用反射附加字段,并获取您感兴趣的任何字段

  • 通过从目标对象获取值,使用反射附加值

  • 更多详细信息,请查看下面我的博客帖子:

    vcfvct.wordpress.com/2015/06/30/使用反射将嵌套的json文件转换为java中的csv/

    您可以使用该库将json转换为csv

    此库不需要任何POJO。它只需将JSON作为字符串,并以
    列表
    的格式返回它的二维表示形式

    例如,对于JSON:

        for (Entry<String, JsonElement> s : set) {
    
            System.out.println(s.getKey());            //Added
            printJsonRecursive(s.getValue());
    
        }
    
    它给出一个输出:

    {
        "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
    }
    
    /**
    *使用分隔符(逗号、半列、制表符)获取分隔的组件列。
    *
    *@param headers-CSV头文件
    *键值对的@param map包含头和值
    *
    *@返回由特定分隔符分隔的列组成的字符串。
    */
    私有静态字符串GetSeparatedColumns(设置标题、映射映射、字符串分隔符){
    列表项=新建ArrayList();
    for(字符串标题:标题){
    字符串值=map.get(header)=null?”:map.get(header.replaceAll(“[\\,\\;\\r\\n\\t\\s]+”,”);
    增加(价值);
    }
    返回StringUtils.join(items.toArray(),分隔符);
    }
    
    我确实尝试过这个方法。但问题是我可以为数组中的每一行获取密钥。我只希望它打印一次。我无法创建java bean,因为我不知道json的模式。例如,我不知道json将包含什么结构。它应该是通用的
    /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,,,,,
    
    /**
     * 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);
    }