用于创建Json对象的递归方法

时间:2016-02-15 12:45:49

标签: java json recursion

我想知道如何执行以下操作:

我想创建以下的json格式:

我希望能够创建一个递归函数,该函数接受一个对象,该对象包含相同类型的其他对象的列表,并在方法中以递归方式创建下面的格式。

{
    "name": "lib",
    "contains": [{
        "name": "room",
        "contains": [{
            "name": "bookshelf",
            "contains": [{
                "name": "shelf",
                "contains": []
            }]
        }]
    }]
}

我将此作为以下方法:

private JSONObject json = new JSONObject();

public  JSONObject setupLib(Contains contain) {

    int count = contain.getContainerList().size();

    for(int i = 0; i < count; i++){
        try {

            json.put("name", contain.getContainerList().get(i).getContainerName());

            if(contain.getContainerList().size() != 0) {
                Contains contains = (Contains) contain.getContainerList().get(i);

                JSONArray array = new JSONArray();

                json.put("contain",array.put(setupLib(contains)));}
        }catch (JSONException e){
            Log.i(Tag, e.getMessage());
        }
    }

    return json;

} 我得到了数组/对象的堆栈溢出

2 个答案:

答案 0 :(得分:3)

两个选项

  1. 递归地自己动手
  2. 使用Gson等库来节省开发时间和精力
  3. 由于这是一次学习经历,我已经展示了两个返回此JSON。

    {
        "name": "lib",
        "contains": [{
            "name": "room",
            "contains": [{
                "name": "bookshelf",
                "contains": [{
                    "name": "shelf",
                    "contains": []
                }]
            }]
        }]
    }
    
    public static void main(String[] args) {
        Contains lib = new Contains("lib");
        Contains room = new Contains("room");
        Contains bookshelf = new Contains("bookshelf");
        Contains shelf = new Contains("shelf");
    
        bookshelf.add(shelf);
        room.add(bookshelf);
        lib.add(room);
    
        // Option 1
        System.out.println(setupLib(lib).toJSONString());
    
        // Option 2
        Gson gson = new Gson();
        System.out.println(gson.toJson(lib));
    }
    
    private static JSONObject setupLib(Contains contain) {
        if (contain == null) return null;
        LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
    
        JSONArray array = new JSONArray();
        for (Contains c : contain.getContainerList()) {
            JSONObject innerContain = setupLib(c);
            if (innerContain != null) {
                array.add(innerContain);
            }
        }
        map.put("name", contain.getName());
        map.put("contains", array);
    
        return new JSONObject(map);
    }
    

    这是模型对象,供参考

    public class Contains {
        @SerializedName("name")
        @Expose
        private String name;
        @SerializedName("contains")
        @Expose
        private List<Contains> contains;
    
        public Contains(String name) {
            this.name = name;
            contains = new ArrayList<Contains>();
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void add(Contains c) {
            this.contains.add(c);
        }
    
        public void setContainerList(List<Contains> contains) {
            this.contains = contains;
        }
    
        public String getName() {
            return name;
        }
    
        public List<Contains> getContainerList() {
            return this.contains;
        }
    }
    

答案 1 :(得分:0)

如果你序列化JSONObjectContains类,我认为会容易得多。这样您就可以使用Jackson库为您创建JSON文件。

您可以在以下GitHub页面上找到有关杰克逊图书馆的更多信息:https://github.com/FasterXML/jackson