首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将对象序列化为CSV文件?

如何将对象序列化为CSV文件?
EN

Stack Overflow用户
提问于 2010-09-08 08:47:17
回答 8查看 122.6K关注 0票数 29

我想要将一个对象写入CSV文件。对于XML,我们有像this这样的XStream

所以,如果我想将object转换为CSV,我们有这样的库吗?

我想把我的Bean列表传递给一个方法,这个方法应该把bean的所有字段都写到CSV。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-09-08 08:52:41

首先,序列化是将对象“按原样”写入文件。AFAIK,您不能选择文件格式和全部。序列化对象(在文件中)有它自己的“文件格式”

如果您想要将对象(或对象列表)的内容写入CSV文件,您可以自己完成,这不应该很复杂。

看起来Java CSV Library可以做到这一点,但我自己还没有尝试过。

编辑:参见下面的示例。这绝不是万无一失的,但您可以在此基础上进行构建。

代码语言:javascript
运行
AI代码解释
复制
    //European countries use ";" as 
    //CSV separator because "," is their digit separator
    private static final String CSV_SEPARATOR = ",";
    private static void writeToCSV(ArrayList<Product> productList)
    {
        try
        {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("products.csv"), "UTF-8"));
            for (Product product : productList)
            {
                StringBuffer oneLine = new StringBuffer();
                oneLine.append(product.getId() <=0 ? "" : product.getId());
                oneLine.append(CSV_SEPARATOR);
                oneLine.append(product.getName().trim().length() == 0? "" : product.getName());
                oneLine.append(CSV_SEPARATOR);
                oneLine.append(product.getCostPrice() < 0 ? "" : product.getCostPrice());
                oneLine.append(CSV_SEPARATOR);
                oneLine.append(product.isVatApplicable() ? "Yes" : "No");
                bw.write(oneLine.toString());
                bw.newLine();
            }
            bw.flush();
            bw.close();
        }
        catch (UnsupportedEncodingException e) {}
        catch (FileNotFoundException e){}
        catch (IOException e){}
    }

这是product (为提高可读性而隐藏的getter和setter):

代码语言:javascript
运行
AI代码解释
复制
class Product
{
    private long id;
    private String name;
    private double costPrice;
    private boolean vatApplicable;
}

这是我如何测试的:

代码语言:javascript
运行
AI代码解释
复制
public static void main(String[] args)
{
    ArrayList<Product> productList = new ArrayList<Product>();
    productList.add(new Product(1, "Pen", 2.00, false));
    productList.add(new Product(2, "TV", 300, true));
    productList.add(new Product(3, "iPhone", 500, true));
    writeToCSV(productList);
}

希望这能有所帮助。

干杯。

票数 34
EN

Stack Overflow用户

发布于 2010-09-08 08:54:12

为了方便CSV访问,有一个名为OpenCSV的库。它确实简化了对CSV文件内容访问。

编辑

根据您的更新,我认为所有以前的回复都是不正确的(由于它们的级别较低)。然后你可以用一种完全不同的方式,实际上是hibernate的方式!

通过使用CsvJdbc驱动程序,您可以加载您的CSV文件作为JDBC数据源,然后将bean直接映射到此数据源。

我本想和你谈谈CSVObjects的,但由于这个网站似乎出了问题,我担心现在库不能用了。

票数 6
EN

Stack Overflow用户

发布于 2012-01-19 21:47:55

拥有csv序列化程序会很有趣,因为与其他序列化方法相比,它占用的空间最小。

对java对象最接近csv的支持是spring utils项目提供的stringutils。

arrayToCommaDelimitedString(Object[] arr),但它远不是一个序列化程序。

下面是一个简单的实用程序,它使用反射来序列化值对象

代码语言:javascript
运行
AI代码解释
复制
public class CSVWriter
{
private static String produceCsvData(Object[] data) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
    if(data.length==0)
    {
        return "";
    }

    Class classType = data[0].getClass();
    StringBuilder builder = new StringBuilder();

    Method[] methods = classType.getDeclaredMethods();

    for(Method m : methods)
    {
        if(m.getParameterTypes().length==0)
        {
            if(m.getName().startsWith("get"))
            {
                builder.append(m.getName().substring(3)).append(',');
            }
            else if(m.getName().startsWith("is"))
            {
                builder.append(m.getName().substring(2)).append(',');
            }

        }

    }
    builder.deleteCharAt(builder.length()-1);
    builder.append('\n');
    for(Object d : data)
    {
        for(Method m : methods)
        {
            if(m.getParameterTypes().length==0)
            {
                if(m.getName().startsWith("get") || m.getName().startsWith("is"))
                {
                    System.out.println(m.invoke(d).toString());
                    builder.append(m.invoke(d).toString()).append(',');
                }
            }
        }
        builder.append('\n');
    }
    builder.deleteCharAt(builder.length()-1);
    return builder.toString();
}

public static boolean generateCSV(File csvFileName,Object[] data)
{
    FileWriter fw = null;
    try
    {
        fw = new FileWriter(csvFileName);
        if(!csvFileName.exists())
            csvFileName.createNewFile();
        fw.write(produceCsvData(data));
        fw.flush();
    }
    catch(Exception e)
    {
        System.out.println("Error while generating csv from data. Error message : " + e.getMessage());
        e.printStackTrace();
        return false;
    }
    finally
    {
        if(fw!=null)
        {
            try
            {
                fw.close();
            }
            catch(Exception e)
            {
            }
            fw=null;
        }
    }
    return true;
}

}

下面是一个示例值对象

代码语言:javascript
运行
AI代码解释
复制
public class Product {
private String name;
private double price;
private int identifier;
private boolean isVatApplicable;
public Product(String name, double price, int identifier,
        boolean isVatApplicable) {
    super();
    this.name = name;
    this.price = price;
    this.identifier = identifier;
    this.isVatApplicable = isVatApplicable;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public double getPrice() {
    return price;
}
public void setPrice(long price) {
    this.price = price;
}
public int getIdentifier() {
    return identifier;
}
public void setIdentifier(int identifier) {
    this.identifier = identifier;
}
public boolean isVatApplicable() {
    return isVatApplicable;
}
public void setVatApplicable(boolean isVatApplicable) {
    this.isVatApplicable = isVatApplicable;
}

}

和运行实用程序的代码

代码语言:javascript
运行
AI代码解释
复制
public class TestCSV 
{
public static void main(String... a)
{
    Product[] list = new Product[5];
    list[0] = new Product("dvd", 24.99, 967, true);
    list[1] = new Product("pen", 4.99, 162, false);
    list[2] = new Product("ipad", 624.99, 234, true);
    list[3] = new Product("crayons", 4.99,127, false);
    list[4] = new Product("laptop", 1444.99, 997, true);
    CSVWriter.generateCSV(new File("C:\\products.csv"),list);
}

}

输出:

代码语言:javascript
运行
AI代码解释
复制
Name    VatApplicable   Price   Identifier
dvd     true            24.99   967
pen     false           4.99    162
ipad    true            624.99  234
crayons false           4.99    127
laptop  true            1444.99 997
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3666007

复制
相关文章
Json取值工具类
喜欢总结一些工作中写的代码,将部分代码抽离出来,形成一个小的工具类或者jar包,方便在各个项目中使用,这样时间久了、总结的多了就形成了自己的代码库,这些都是自己的资源。本篇将总结一个从Json字符串中直接取指定key值的工具类,详细代码如下: import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.common.base.Strings; import org.junit
JavaQ
2018/04/04
2K0
python中将字符串转为json对象并取值
"messages": ["Could not find resource or operation 'BZK1.MapServer' on the system."],
用户7886150
2021/01/16
2.3K0
Java从Object取值
在我们进行springboot的model、view、controller方式进行的时候,常常会遇到需要从请求的参数中去除具体值的业务,下面我们就提供了一种Java从Object对象中解析出对象属性和对象值之后并转换为实体的过程,示例代码如下:
问问计算机
2021/05/08
3.3K0
javascript中json对象json数组json字符串互转及取值
今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下:
kirin
2020/10/30
4.9K0
loadrunner动态从mysql取值
loadrunner动态从mysql取值 [需要下载跟数据库服务器一致的dll,32位或64位]
流柯
2018/08/31
1K0
Python使用JSON序列化从入门到精通
JSON(JavaScript Object Notation)是一个轻量级的数据交换格式,Python标准库json完美实现了该格式,用法类似于marshal和pickle。 >>> import json # 序列化列表对象 # 直接查看序列化后的结果 >>> json.dumps(['a','b','c']) '["a", "b", "c"]' # 反序列化 >>> json.loads(_) ['a', 'b', 'c'] # 序列化字典对象 >>> json.dumps({'a':1, 'b':2
Python小屋屋主
2018/04/16
1.1K0
JS中的JSON对象 定义和取值[通俗易懂]
1.JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。
全栈程序员站长
2022/08/03
8.9K0
前端接收的json对象取值问题
前端只能接收json对象类型的数据,使用之前先导入阿里巴巴的json的jar包。名字如下图所示,去白百度下载会即可。
微醺
2019/01/17
2.8K0
从机器学习学python(三) ——数组冒号取值与extend
从机器学习学python(三)——数组冒号取值与extend (原创内容,转载请注明来源,谢谢) 一、数组冒号取值 1、 小白级别 python的特有取值方式,假设数组a = [0,1,2,3,4],则: b=a[:3]表示b取数组a第四个元素之前的元素,即b=[0,1,2] c=a[:-1]则表示取a最后一个元素前面的所有元素,即c=[0,1,2,3] 原理是因为冒号前面带0的可以省略掉。 2、困难级别 b=array( [ [ [ 0, 1, 2, 3]
用户1327360
2018/03/07
1.7K0
使用Python解析JSON
参考链接: Python-Json 3 : python中验证是否为有效JSON数据
用户7886150
2021/01/16
2.7K0
Python中使用Json
最近编写python中,需要使用python中的json模块,所以尝试对Json模块做一个简单的了解
py3study
2020/01/09
8190
Python解析和使用json
我们在Python中经常使用json文件,下面将阐述如何解析json文件 我们需要引入json库 import json 首先使用load命令,解析json jsons = json.load(此处放置要解析的json变量) 接下来就可以直接使用jsons了,例如: abc=jsons["abc"] 数据编码: json.dumps()
Chuanrui 初见之旅
2022/11/14
1.4K0
python json文件的使用
json是一种轻量级数据交换格式,常用于http请求中,在日常运维工作中经常可以看到
py3study
2020/01/06
2.2K0
php取得json_decode中的值,php json decode-获取值[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 正如Danp已经说过的,返回的JSON包含在函数调用中(由 jsoncallback=json )你不能完全摆脱这个,但是,只是用 AreaSearch?js
全栈程序员站长
2022/09/09
8.6K0
Python中JSON的基本使用
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumps、dump、loads、load。
py3study
2020/01/06
3.6K0
Python json和simplejson的使用
在Python中,json字符串和Python数据类型的转换可以使用json模块或simplejson模块。
Python碎片公众号
2021/02/26
2.2K0
Python json和simplejson的使用
使用Python附加到JSON文件
JSON的完整形式是JavaScript Object Notation。这意味着将使用编程语言的文本组成的脚本(可执行)文件用于存储和传输数据。Python通过名为的内置包支持JSON json。要使用此功能,我们以Python脚本导入json包。JSON中的文本是通过带引号的字符串完成的,该字符串包含中的键-值映射中的值{ }。
用户7466307
2020/07/02
1.8K0
使用Python附加到JSON文件
【Python】json 格式转换 ① ( json 模块使用 | 列表转 json | json 转列表 | 字典转 json | json 转字典 )
然后 , 准备 python 数据 , 将数据放到 list 列表中 , 列表中的元素是 dict 字典 ;
韩曙亮
2023/10/11
8620
【Python】json 格式转换 ① ( json 模块使用 | 列表转 json | json 转列表 | 字典转 json | json 转字典 )
使用python通过http发送json
因为需要通过http协议向服务器post一些数据,于是用python写了一个相关小程序,没想到遇到了一些问题,于是就在这里将这个问题记录一下。
py3study
2020/01/13
3K0
『Python开发技巧』使用python处理json文件
json格式对应python里面的字典,可以通过json模块很方便保存处理,下面的代码用来抛砖引玉。。
小宋是呢
2022/03/07
9120

相似问题

使用Python从JSON获取值

53

使用python从json中获取值

24

Python从Json提取值

12

使用Python从Json脚本循环和取值

219

使用Python从JSON API中提取值

222
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档