【问题标题】:Recursive Method to create Json object递归方法创建 Json 对象
【发布时间】:2016-05-26 09:17:10
【问题描述】:

我想知道我可以如何做以下事情:

我想创建如下的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;

} 我在数组/对象上得到一个 stackoverflow

【问题讨论】:

  • 您需要提供setupLib 的完整代码,或者更好的是一个小型的自包含可编译示例来演示该问题。您的代码中的 json 变量是什么? setupLib 返回什么?
  • 我添加了返回值,它应该返回一个类似上述格式的构建 json。只是不确定如何使递归起作用。
  • 您对空列表的 if 语句毫无意义,因为 for 循环已经这样做了。如果你使用 Gson 库,你可以很容易地序列化你的类对象
  • 序列化是什么意思,它如何允许我以递归方法创建多个对象?这不应该以某种方式工作吗?

标签: java json recursion


【解决方案1】:

两个选项

  1. 递归地自己做
  2. 使用诸如Gson 之类的库来节省您的开发时间和精力

由于这是一次学习体验,我已经展示了两者都返回此 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;
    }
}

【讨论】:

  • 谢谢@cricket_007,非常感谢!
  • 是的。而且我从未测试过为什么您会收到堆栈溢出,但是如果对象包含自己,就会发生这种情况
  • 关于如果我要使用 GSON 将如何反序列化的快速问题。 --> 我的类包含扩展了具有 List 的 Container。类 Container 只是其中的名称。当我尝试反序列化时,我得到一个对象包含但它不包含其他对象包含但容器。
  • Contains 对象和Container 有什么区别?为什么需要Container
  • 因为我需要能够在其中添加其他对象,在此示例中包含一个扩展 Container 的书籍对象。
【解决方案2】:

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

您可以在以下 GitHub 页面上找到有关 Jackson 库的更多信息:https://github.com/FasterXML/jackson

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 2012-08-03
    • 2012-05-31
    • 1970-01-01
    • 2012-12-14
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多