0

指定されたキーの JSON オブジェクトを検索し、そのキーの JSONObject または String 値を返すことを目的とした次のメソッド定義があります。JSON オブジェクトのすべてのレベルを確実に検索するために、再帰的にしましたが、より深い JSONObject を返すことができる場合のみです。コンパイラは、戻り値の型を宣言したため、これはオブジェクトを返さなければならないと文句を言います。罰金。2 つのケースでオブジェクトを返していますが、状況によっては何も返さないという問題があると思います。最終的な戻り値 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

このEitherクラスは、まさにこのような状況のために作られました。こちらのドキュメントを参照してください

使用法:

Either<OneResultType,OtherResultType> result;

これにより、高価な instanceOf チェックが回避されます。nullオブジェクトが見つからない場合に戻ります。

于 2013-01-07T19:06:41.003 に答える
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 に答える
0

このメソッドは、while ループ条件が終了し、「false を返す」に到達するまで、常に else if を押し続けた場合にのみ、false を返し続けます。

return false の代わりに return null; 最後と呼び出し元のメソッドで、返されたオブジェクトが null であるかどうかを確認します。これは、何も見つからなかったことを意味します

于 2013-01-07T18:40:15.447 に答える
0

リターンヌルを追加します。while ループの下

于 2013-01-07T18:34:58.540 に答える