我有一个流列表,想要转换为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并保存为文件?
由于
答案 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();
}
}
很明显,这只是这种方法的一个例子,必须根据项目/提问者的需求和要求进行定制。由于数组序列化以通用方式工作,因此不会涉及任何冗余代码,并且由于这不依赖于反射(杰克逊所依赖的反射),因此它将更加高效。