简体   繁体   English

将平面列表转换为层次结构列表,然后将其转换为JSON

[英]Converting a flat list to a hierarchy list, then converting it to a JSON

I'm having some trouble converting a "flat" list to a hierarchy list. 我在将“平面”列表转换为层次结构列表时遇到了一些麻烦。

The orignal list only knows who the parent is but I would like to convert so that it knows who its children are instead, also preferably sort it at the same time so that they get added to the list in the order of 原始清单只知道谁是父母,但我想进行转换,以便知道自己的孩子是谁,最好同时对其进行排序,以便按照以下顺序将其添加到清单中

1.1 Parent 
      2.2 Child
               3.3 Child
                        4.4 Child
      2.5 Child
               3.6 Child
1.7 Parent
      2.8 Child

This is what I've got atm. 这就是我的atm。 This however only works for down to 2 levels, I want some method which works no matter how deep it has to go. 但是,这仅适用于2级,我想要某种方法,无论深度有多深。

    System.out.println("Trying to sort the list so that things get added in the order of 1. parent -> 2. children ");
    for(int i = 0; i < arrayListUnsorted.size() ; i++){
            if(arrayListUnsorted.get(i).getParent().equals("#")){
                arrayListSorted.add(arrayListUnsorted.get(i));
                arrayListUnsorted.remove(i);
            }
    }

    for(int a = 0; a < arrayListSorted.size(); a++){
        for(int b = 0; b < arrayListUnsorted.size(); b++){
            if(Integer.toString(arrayListSorted.get(a).getId()).equals(arrayListUnsorted.get(b).getParent())){
                arrayListSorted.add(arrayListUnsorted.get(b));
                arrayListUnsorted.remove(b);
            }

        }
    }   

Model: 模型:

public class TreeBranchModel {

private int id;
private String text;
private String parent;

public TreeBranchModel(int id, String text, String parent) {
    super();
    this.id = id;
    this.text = text;
    this.parent = parent;
}
*Getters/Setters*

Model to be converted to: 要将模型转换为:

public class TreeBranchModelHeirachy {

private int id;
private String text;
private ArrayList<TreeBranchModelHeirachy> children;

public TreeBranchModelHeirachy(int id, String text, ArrayList<TreeBranchModelHeirachy> children) {
    super();
    this.id = id;
    this.text = text;
    this.children = children;
}
*Getters/Setters*

Any help is greatly appreciated. 任何帮助是极大的赞赏。

Please use the following code implemented using Gson library 请使用通过Gson库实现的以下代码

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) {

    List<Node> list=new ArrayList<Node>();

    Node n2=new Node("2","n2","d2");
    Node n3=new Node("3","n3","d3");
    Node n4=new Node("4","n4","d4");
    list.add(n2);
    list.add(n3);
    list.add(n4);

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

}

This is the output: 这是输出:

 {"id":"1","name":"n1","data":"d1","children":[{"id":"2","name":"n2","data":"d2"},{"id":"3","name":"n3","data":"d3"},{"id":"4","name":"n4","data":"d4"}]}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM