将JSON转换为Java中的XLS/CSV

40

有没有人有将JSON文档转换为XLS / CSV文件的Java示例代码?我已经尝试在Google上搜索,但没有结果。

有没有样例Java代码可以将JSON文档转化为XLS/CSV文件呢?我已经在Google上进行了搜索,但是没有找到相关的信息。

请参考Matt York在这里的答案:https://dev59.com/KnRB5IYBdhLWcg3wUFvB - JMax
4
他要求将Json转换为CSV格式,而不是将CSV转换为Json。 - Ondrej Tokar
3个回答

45

你只能将JSON数组转换为CSV文件。

假设你有以下的JSON:

{"infile": [{"field1": 11,"field2": 12,"field3": 13},
            {"field1": 21,"field2": 22,"field3": 23},
            {"field1": 31,"field2": 32,"field3": 33}]}

让我们看一下将其转换为csv的代码:

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.json.CDL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class JSON2CSV {
    public static void main(String myHelpers[]){
        String jsonString = "{\"infile\": [{\"field1\": 11,\"field2\": 12,\"field3\": 13},{\"field1\": 21,\"field2\": 22,\"field3\": 23},{\"field1\": 31,\"field2\": 32,\"field3\": 33}]}";

        JSONObject output;
        try {
            output = new JSONObject(jsonString);


            JSONArray docs = output.getJSONArray("infile");

            File file=new File("/tmp2/fromJSON.csv");
            String csv = CDL.toString(docs);
            FileUtils.writeStringToFile(file, csv);
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }

}
现在您已经获得了从JSON生成的CSV文件。 它应该是这样的:
field1,field2,field3
11,22,33
21,22,23
31,32,33

这个 Maven 依赖项的样子就像这样:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

更新于2019年12月13日:

现在我们也支持复杂的JSON数组。

import java.nio.file.Files;
import java.nio.file.Paths;

import com.github.opendevl.JFlat;

public class FlattenJson {

    public static void main(String[] args) throws Exception {
        String str = new String(Files.readAllBytes(Paths.get("path_to_imput.json")));

        JFlat flatMe = new JFlat(str);

        //get the 2D representation of JSON document
        flatMe.json2Sheet().headerSeparator("_").getJsonAsSheet();

        //write the 2D representation in csv format
        flatMe.write2csv("path_to_output.csv");
    }

}

依赖项和文档细节在链接中。


3
您可以使用相同的三个参数方法。 FileUtils.writeStringToFile(file, csv, null); 第三个参数是编码,null表示平台默认。 - Sridhar
1
@keinabel 我不确定,我猜apache里有一个CDL库,你也可以去查一下。但是,我不确定那个会不会起作用。否则,你就得写一个循环来迭代JSON数组,这真的很麻烦:( 所以,请告诉我哪一个对你有用。祝你好运。 - Sridhar
2
@GowthamanM 你可以使用 apache-poi 库将数据写入Excel文件。但是,你必须迭代JsonArray中的 docs ,以便写入每个单元格的数据。 - Sridhar
2
@GowthamanM 我认为仅仅更改文件扩展名是行不通的。我建议您将JSON保存为CSV(使用上面的代码块),然后读取CSV(使用CSVReader)并将其写入XLS(使用apache-poi)[csv_to_xls](http://thinktibits.blogspot.in/2012/12/Convert-CSV-to-XLS-Using-Java-POI-OpenCSV-Example.html)。在这里,您还可以将标题设置为黑色背景的粗体字(正如您之前所要求的)。 - Sridhar
1
@PedroJoaquín 我已经使用新的库更新了答案。希望这能解决你遇到的问题。 - Sridhar
显示剩余19条评论

3
你可以使用commons csv将其转换为CSV格式。或者使用POI将其转换为xls格式。如果需要帮助将其转换为xls格式,可以使用jxls,它可以使用表达式语言将Java bean(或列表)转换为Excel。
基本上,JSON文档可能是一个JSON数组,对吧?所以结果将是列表,您只需编写要在Excel格式中显示的属性,这将由jxls读取。请参见http://jxls.sourceforge.net/reference/collections.html 如果问题是无法在jxls Excel属性中读取JSON,请先将其序列化为Java bean集合。

你会如何将 {'foo': {'bar': [1, 2, 3]}} 映射到电子表格中? - user647772
这就是为什么我说,如果JSON对象是JSON单个对象而不是JSON数组,那么结果将在电子表格中显示1行。如果JSON对象是JSON数组,则行数将与JSON数组大小相同。还有一点,您必须指定要写入该电子表格的属性。例如,如果您想显示bar(其值为数组),则列可能会显示java.lang.Array@xxxxx,但它确实是一个数组,对吧。但是,如果对象是[{name:'a','bar':[1,2,3]},{name:'b','bar':[2,3,4]}],并且您只想显示名称,这是可行的,对吧? - Jef

-4

JSON文档基本上由列表和字典组成。没有明显的方法将这样的数据结构映射到二维表中。


1
如果JSON文件是一个扁平数组,所有对象都具有相同的字段名称,则可以将其映射到二维表中。请参见@Sridhar的示例输入。 - Ron Romero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接