JSONObject の 1 つのメソッドをオーバーライドすることを達成したいと考えています。したがって、要素が 1 つであっても、常にリストを返します。
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
public class JSONObjectDecorator extends JSONObject {
public JSONObjectDecorator(JSONObject jsonObject) {
super(jsonObject, JSONObject.getNames(jsonObject));
}
@Override
public List<String> get(String field){
List<String> result = new ArrayList<String>();
if (!isNull(field)) {
Object data = get(field);
if (data instanceof JSONArray) {
JSONArray array = (JSONArray) data;
for (int i=0; i< array.length(); i++){
result.add(array.getString(i));
}
} else {
result.add(data.toString());
}
}
return result;
}
}
現在、このコードは次の行のために StackOverflowError を返します。
Object data = get(field);
どうすればこれを達成できますか?
更新: なぜそれが StackOverflowError なのかはわかっています。@Andy Turner が強調表示したように、super.get がコンストラクターの問題を解決しますが、たとえば、JSONObjectDecorator のインスタンスで getString() を呼び出すと、フィールドが文字列ではないという例外がスローされます。 . (リストなので、おそらく「getString」は「get」を呼び出します)
JSONObjectで「get(String field)」が呼び出された場所を確認します。解決策は、これらのメソッドもオーバーライドすることだと思います。