如何使用Jackson将自我迭代的ArrlyList转换为json

时间:2015-05-18 05:50:59

标签: java json jackson

我想将List数据转换为下面的json结构,因为我已经将数据从mysql中提取到arraylist中,并且还编写了pojo类EducationDTO。

{
"id": "1",
"name": "EDUCATION",
"data": "",
"children": [
    {
        "id": "1.1",
        "name": "STREAM-ENGG",
        "data": "",
        "children": [
            {
                "id": "1.11",
                "name": "COMPUTER SCIENCE",
                "data": "",
                "children": [
                    {
                        "id": "1.111",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.112",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.113",
                        "name": "YEAR-03",
                        "data": ""
                    },
                    {
                        "id": "1.114",
                        "name": "YEAR-04",
                        "data": ""
                    }
                ]
            },
            {
                "id": "1.12",
                "name": "EXTC",
                "data": "",
                "children": [
                    {
                        "id": "1.121",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.122",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.123",
                        "name": "YEAR-03",
                        "data": ""
                    },
                    {
                        "id": "1.124",
                        "name": "YEAR-04",
                        "data": ""
                    }
                ]
            },
            {
                "id": "1.13",
                "name": "BIOMEDICAL",
                "data": "",
                "children": [
                    {
                        "id": "1.131",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.132",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.133",
                        "name": "YEAR-03",
                        "data": ""
                    },
                    {
                        "id": "1.134",
                        "name": "YEAR-04",
                        "data": ""
                    }
                ]
            },
            {
                "id": "1.14",
                "name": "CHEMICAL",
                "data": "",
                "children": [
                    {
                        "id": "1.141",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.142",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.143",
                        "name": "YEAR-03",
                        "data": ""
                    },
                    {
                        "id": "1.144",
                        "name": "YEAR-04",
                        "data": ""
                    }
                ]
            }
        ]
    },
    {
        "id": "1.2",
        "name": "STREAM-MEDICAL",
        "data": "",
        "children": [
            {
                "id": "1.21",
                "name": "MBBS",
                "data": "",
                "children": [
                    {
                        "id": "1.211",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.212",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.212",
                        "name": "YEAR-03",
                        "data": ""
                    },
                    {
                        "id": "1.213",
                        "name": "YEAR-04",
                        "data": ""
                    },
                    {
                        "id": "1.214",
                        "name": "YEAR-05",
                        "data": ""
                    }
                ]
            },
            {
                "id": "1.22",
                "name": "BHMS",
                "data": "",
                "children": [
                    {
                        "id": "1.221",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.222",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.223",
                        "name": "YEAR-03",
                        "data": ""
                    }
                ]
            },
            {
                "id": "1.31",
                "name": "BDS",
                "data": "",
                "children": [
                    {
                        "id": "1.311",
                        "name": "YEAR-01",
                        "data": ""
                    },
                    {
                        "id": "1.312",
                        "name": "YEAR-02",
                        "data": ""
                    },
                    {
                        "id": "1.313",
                        "name": "YEAR-03",
                        "data": ""
                    },
                    {
                        "id": "1.314",
                        "name": "YEAR-04",
                        "data": ""
                    }
                ]
            }
        ]
    }
]

}

我很难理解我写过的逻辑,它会包含重复的代码。

JsonFactory jFactory=new JsonFactory();
Writer writer = new StringWriter();
JsonGenerator jsGenerator = jFactory.createJsonGenerator(writer);
jsGenerator.writeStartObject();

jsGenerator.writeEndObject();
for(EducationDTO eDto:vDto.getEducationDTOList()){
    if(eDto.getParent_Id().equalsIgnoreCase("0")){
        jsGenerator.writeStringField("id",eDto.getUnid());
        jsGenerator.writeStringField("name",eDto.getNode_Name());
        jsGenerator.writeStringField("data","");
        if(eDto.getHasChildren().equalsIgnoreCase("YES")){
            jsGenerator.writeFieldName("children");
            jsGenerator.writeStartArray();
            for(EducationDTO eDto2:vDto.getEducationDTOList()){
                if(eDto2.getParent_Id().equalsIgnoreCase(eDto.getUnid())){
                    jsGenerator.writeStartObject();
                    jsGenerator.writeStringField("id",eDto.getUnid());
                    jsGenerator.writeStringField("name",eDto2.getNode_Name());
                    jsGenerator.writeStringField("data","");
                    if(eDto2.getHasChildren().equalsIgnoreCase("YES")){
                        jsGenerator.writeFieldName("children");
                        jsGenerator.writeStartArray();
                        for(EducationDTO eDto3:vDto.getEducationDTOList()){
                            if(eDto3.getParent_Id().equalsIgnoreCase(eDto2.getUnid())){
                                jsGenerator.writeStartObject();
                                jsGenerator.writeStringField("id",eDto.getUnid());
                                jsGenerator.writeStringField("name",eDto3.getNode_Name());
                                jsGenerator.writeStringField("data","");
                                if(eDto2.getHasChildren().equalsIgnoreCase("YES")){
                                    jsGenerator.writeFieldName("children");
                                    jsGenerator.writeStartArray();
                                    for(EducationDTO eDto4:vDto.getEducationDTOList()){
                                        if(eDto4.getParent_Id().equalsIgnoreCase(eDto3.getUnid())){
                                            jsGenerator.writeStartObject();
                                            jsGenerator.writeStringField("id",eDto4.getUnid());
                                            jsGenerator.writeStringField("name",eDto4.getNode_Name());
                                            jsGenerator.writeStringField("data","");
                                            jsGenerator.writeEndObject();
                                        }
                                    }
                                    jsGenerator.writeEndArray();

                                }
                                jsGenerator.writeEndObject();
                            }
                        }
                        jsGenerator.writeEndArray();

                    }
                    jsGenerator.writeEndObject();
                }
            }
            jsGenerator.writeEndArray();

        }
        break;
    }
}


jsGenerator.close();

2 个答案:

答案 0 :(得分:0)

以下是将Java Object转换为json的方法

ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("c:\\EducationDTO.json"), EducationDTO);

ArrayList也是一个Java对象,即使java Object有迭代对象,它也会将它转换为JSON。

假设你有像

这样的递归对象
  

A类{A a; // setter and getters}

在模型类中使用JsonIdentityInfo来打破循环循环。

或与

一起使用

使用Jackson-Jsog plugin并使用以下注释注释每个类。 @JsonIdentityInfo(发电机= JSOGGenerator.class)

答案 1 :(得分:0)

请使用以下代码:

import java.lang.reflect.Field;
import java.util.List;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonConvertor {

private static GsonBuilder gsonBuilder;
private static Gson gson;

private JsonConvertor() {

}
public static Object fromJson(String json, Class clz)
{
    gson=new Gson();
    return gson.fromJson(json,clz);
}

public static String toJson(Object obj) {
    gsonBuilder = new GsonBuilder();
    gsonBuilder = gsonBuilder
            .addSerializationExclusionStrategy(new CustomIclusionStrategy(
                    obj.getClass()));
    gson = gsonBuilder.create();
    String json = gson.toJson(obj);
    return json;
}

}

class CustomIclusionStrategy implements ExclusionStrategy {

private Class classToIclude;

private Field[] declaredFields;


private List<FieldAttributes> fields;

public CustomIclusionStrategy(List<FieldAttributes> fields) {
    this.fields = fields;
}

public CustomIclusionStrategy(Class classToIclude) {
    this.classToIclude = classToIclude;
    this.declaredFields=classToIclude.getDeclaredFields();

}

// called only if shouldSkipClass returns false
@Override
public boolean shouldSkipField(FieldAttributes f) {

    try {
        classToIclude.getSuperclass().getDeclaredField(f.getName());
        System.out.println(f.getName());
        return true;
    } catch (Exception e) {
    } 
    return false;

}

@Override
public boolean shouldSkipClass(Class<?> clazz) {
    // if returns false shouldSkipField will be called, otherwise 
 //shouldSkipField will not be called
    return false;
}
}

并从此处致电:

 import java.util.ArrayList;
 import java.util.List;


public class Node {

String id;
String name;
String data;
List<Node> children;
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getData() {
    return data;
}
public void setData(String data) {
    this.data = data;
}
public List<Node> getChildren() {
    return children;
}
public void setChildren(List<Node> children) {
    this.children = children;
}

public String toJson()
{
    return JsonConvertor.toJson(this);
}

public Node(String id, String name, String data) {
    super();
    this.id = id;
    this.name = name;
    this.data = data;
}
public Node(String id, String name, String data, List<Node> children) {
    super();
    this.id = id;
    this.name = name;
    this.data = data;
    this.children = children;
}
 public static void main(String[] args) {

    Node n5=new Node("1","YEAR-01","");
    List<Node> list3=new ArrayList<Node>();
    list3.add(n5);


    Node n3=new Node("1","COMPUTER SCIENCE","",list3);
    Node n4=new Node("1","EXTC","",list3);
    List<Node> list=new ArrayList<Node>();
    List<Node> list2=new ArrayList<Node>();

    list2.add(n3);

    list2.add(n4);
    Node n2=new Node("1","STREAM-ENGG","",list2);

    list.add(n2);


    Node n1=new Node("1","EDUCATION","",list);
    System.out.println(n1.toJson());

}

}

这是你生成的json

{
    "id": "1",
    "name": "EDUCATION",
    "data": "",
    "children": [{
        "id": "1",
        "name": "STREAM-ENGG",
        "data": "",
        "children": [{
            "id": "1",
            "name": "COMPUTER SCIENCE",
            "data": "",
            "children": [{
                "id": "1",
                "name": "YEAR-01",
                "data": ""
            }]
        },
        {
            "id": "1",
            "name": "EXTC",
            "data": "",
            "children": [{
                "id": "1",
                "name": "YEAR-01",
                "data": ""
            }]
        }]
    }]
}