将列表转换为json文件

时间:2016-11-26 17:18:18

标签: java json collections java-stream

我有一个流列表,想要转换为json并保存为json文件。

代码如下:

stream
          .map(e -> e.split(";"))
          .map(e -> {
            Industry in = new Industry();
            in.code = Integer.parseInt(e[0]);
            in.description = e[1];
            return in;
          })
          .collect(Collectors.toList())
          .forEach(e -> System.out.println(e.code));

如何转换为json并保存为文件?

由于

2 个答案:

答案 0 :(得分:0)

我们使用jackson将对象转换为JSON

    stream
      .map(e -> e.split(";"))
      .map(e -> {
        Industry in = new Industry();
        in.code = Integer.parseInt(e[0]);
        in.description = e[1];
        return in;
      })
      .collect(Collectors.toList())
      .forEach(e -> new ObjectMapper().writeValue(
                   new FileOutputStream("data/output" + e.code + ".json"), e));

有关Jackson的更多信息: http://tutorials.jenkov.com/java-json/jackson-objectmapper.html

答案 1 :(得分:0)

我只是写这个答案,只是为了表示课堂序列化比使用像Jackson这样的第三方序列化库要快得多。

对于快速序列化,特别是在分布式计算和繁重的跨应用程序通信的情况下,为此目的开发接口或基类是性能方面的。这与以下代码类似,但不一定相同:

public abstract class JsonCompatible {
    public abstract String jasonSerialize();
    public abstract void jasonDeserialize(String obj);
    protected String[] breakAsJson(String obj){
        return obj.substring(1, obj.length()-2).replace("\"", "").split(",");       
    } 
}

要序列化的数据模型或类可以实现接口或示例抽象类。为了解决提问者的问题并提供解决方案,我为Industry课程开发了一个例子。

public class Industry extends JsonCompatible {
    private String id, description;
    private int code;

    public Industry(String id, String description, int code) {
        this.id = id;
        this.description = description;
        this.code = code;
    }
    public Industry(String id, String description, String code) {
        this.id = id;
        this.description = description;
        this.code = Integer.parseInt(code);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
    public void setCode(String code) {
        this.code = Integer.parseInt(code);
    }    
    public Industry() {
    }

    @Override
    public String jasonSerialize() {
        return String.format("{\"Id\":\"%s\", \"Code\":\"%d\", \"Description\":\"%s\"}", id, code, description);
    }

    @Override
    public void jasonDeserialize(String obj) {
        for(String i : breakAsJson(obj)){
            String[] expand = i.split(":");
            if(expand.length > 1){
                expand[0] = expand[0].trim();
                if(expand[0].equals("Id")){
                    id = expand[1];
                }
                else if (expand[0].equals("Code")){
                    setCode(expand[1]);
                }
                else if(expand[0].equals("Description")){
                    description = expand[1];
                }
            }
        }
    }

}

如示例代码所示,Industry类派生自JsonCopatible。此时,我们可以开发一个数组序列化程序,用于序列化Industry个对象的集合,并将其序列化速度比Jackson执行的速度快得多,如下所示。

public class JsonArray<T extends JsonCompatible> {
    private List<T> obj;
    private String namespace = "Default";
    public JsonArray(List<T> obj) {
        this.obj = obj;
    }

    public JsonArray(List<T> obj, String namespace) {
        this.obj = obj;
        this.namespace = namespace;
    }

    public String getJasonArray(){
        StringBuilder sb = new StringBuilder();
        sb.append("{\"").append(namespace).append("\": [");
        List<String> elements = obj.stream().map(x-> x.jasonSerialize()).collect(Collectors.toList());
        int size = elements.size();
        for(int i = 0; i < size; i++){
            sb.append(elements.get(i));
            if(i < size - 1){
                sb.append(",");
            }
        }
        sb.append("]}");
        return sb.toString();
    }
}

很明显,这只是这种方法的一个例子,必须根据项目/提问者的需求和要求进行定制。由于数组序列化以通用方式工作,因此不会涉及任何冗余代码,并且由于这不依赖于反射(杰克逊所依赖的反射),因此它将更加高效。