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

Java 将平面列表转换为层次结构列表,然后将其转换为JSON,java,json,Java,Json,我在将“平面”列表转换为层次结构列表时遇到一些问题 原始列表只知道父对象是谁,但我想转换它,这样它就可以知道它的子对象是谁,而且最好同时对它进行排序,以便它们按顺序添加到列表中 1.1 Parent 2.2 Child 3.3 Child 4.4 Child 2.5 Child 3.6 Child 1.7 Parent 2.8 Child 这是我的自

我在将“平面”列表转换为层次结构列表时遇到一些问题

原始列表只知道父对象是谁,但我想转换它,这样它就可以知道它的子对象是谁,而且最好同时对它进行排序,以便它们按顺序添加到列表中

1.1 Parent 
      2.2 Child
               3.3 Child
                        4.4 Child
      2.5 Child
               3.6 Child
1.7 Parent
      2.8 Child
这是我的自动取款机。然而,这只适用于低至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);
            }

        }
    }   
要转换为的模型:

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*
公共类树结构{
私有int-id;
私有字符串文本;
私人ArrayList儿童;
公共TreeBranchModelHeirachy(int-id、字符串文本、ArrayList子项){
超级();
this.id=id;
this.text=文本;
这个。孩子=孩子;
}
*能手/二传手*

非常感谢您的帮助。

请使用使用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.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());
}

}
 {"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"}]}