0

我有以下方法定义,旨在搜索给定键的 JSON 对象并返回 JSONObject 或该键的字符串值。为了确保它搜索 JSON 对象的每个级别,我将其设为递归,但仅在可以返回更深的 JSONObject 的情况下。编译器抱怨这必须返回一个 Object,因为我已经声明了该返回类型。美好的。在两种情况下,我返回一个对象,但我认为它的问题是在某些情况下它不会返回任何东西。如果我添加最终返回 false 或其他内容,它将通过编译器检查,但对该方法的调用将始终(最终)返回 false 使其无用。我不习惯像 Java 这样的严格类型的语言,所以我以前没有遇到过类似的问题。任何指针将不胜感激。

public Object find(String contentId, JSONObject node) {
    JSONObject currentNode = (node != null) ? node : this.txtContent;
    Iterator<?> nodeKeys = currentNode.keys();

    while ( nodeKeys.hasNext() ){

        try {
            String key = (String) nodeKeys.next();

            if (key.equals(contentId)) {
                if (currentNode.get(key) instanceof JSONObject) {
                    return currentNode.getJSONObject(key);
                } else {
                    return currentNode.getString(key);
                }
            } else if (currentNode.get(key) instanceof JSONObject) {
                find(contentId, currentNode.getJSONObject(key));
            }
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }
    }
}
4

4 回答 4

1

让我们看看,您应该使用 find 调用返回的值,如果没有找到则返回 null:

public Object find(String contentId, JSONObject node) {
    JSONObject currentNode = (node != null) ? node : this.txtContent;
    Iterator<?> nodeKeys = currentNode.keys();

    while ( nodeKeys.hasNext() ){

        try {
            String key = (String) nodeKeys.next();

            if (key.equals(contentId)) {
                if (currentNode.get(key) instanceof JSONObject) {
                    return currentNode.getJSONObject(key);
                } else {
                    return currentNode.getString(key);
                }
            } else if (currentNode.get(key) instanceof JSONObject) {
                Object foundObj = find(contentId, currentNode.getJSONObject(key));
                if (foundObj!=null) {
                    return foundObj;
                }
            }
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }
    }
    return null;
}
于 2013-01-07T18:42:09.977 回答
1

Either门课就是为这样的情况而设计的。请参阅此处的文档

用法:

Either<OneResultType,OtherResultType> result;

这避免了昂贵的 instanceOf 检查。null如果找不到对象,则返回。

于 2013-01-07T19:06:41.003 回答
0

添加返回空值;在while循环下方

于 2013-01-07T18:34:58.540 回答
0

如果这个方法不断地点击 else if 直到 while 循环条件结束并且你得到你的“return false”,这个方法只会一直返回 false。

而不是 return false 有 return null; 在最后和调用方法中检查返回的对象是否为空,这意味着什么都没有找到

于 2013-01-07T18:40:15.447 回答