【发布时间】:2015-02-25 03:20:48
【问题描述】:
在 Android 中,JSONObject.get(key) 返回一个对象的值。我想根据其包含的数据类型对每个值进行不同的处理。
在我的准系统测试中,我在与 AndroidManifest.xml 相同的文件夹中名为 assets 的文件夹中有一个这样的 JSON 文件:
{
"string": "example"
, "object": {
"zero": 0
, "one": 1
, "two": 2
}
}
这定义了不同类型的值(string、object、integer)。
在我的 Android 应用中,我知道我可以读取此文件并将其转换为 JSONObject。
try {
AssetManager manager = context.getAssets();
// Find the file at PROJECT_FOLDER/app/src/main/assets/myfile.json
InputStream is = manager.open("myfile.json");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
String jsonString = new String(buffer, "UTF-8");
Log.d("TAG", jsonString);
JSONObject json = new JSONObject(jsonString);
} catch (Exception ex) {
ex.printStackTrace();
}
我也知道我可以使用迭代器来单独处理JSONObject 中的每个键。
private void dump(JSONObject json) throws JSONException {
Iterator<String> iterator = json.keys();
while (iterator.hasNext()) {
String key = iterator.next();
Object value = json.get(key);
Log.d(key, " = "+value.toString()); // CHANGE TO GO HERE
}
}
我想检查value本身是否是JSONObject,如果是,则递归调用dump()方法,以便记录整个对象的结构。
编辑
根据@Michael Aaron Safyan 和@royB 的输入,我现在有了以下dump() 方法。
private String dump(JSONObject json, int level) throws JSONException {
Iterator<String> iterator = json.keys();
String output = "";
String padding = "";
for (int ii=0; ii<level; ii++) {
padding += " ";
}
while (iterator.hasNext()) {
String key = iterator.next();
Object value = json.get(key);
if (value instanceof JSONObject) {
output += "\r"+key+": "+dump((JSONObject) value, level+1);
} else {
output += "\r"+padding+key+": "+value;
}
}
return output;
}
这会记录我的测试中的 JSONObject,如下所示:
object:
zero: 0
two: 2
one: 1
string: example
【问题讨论】:
-
您可以使用“x instanceof JSONObject”来确定变量 x 是否具有继承自“JSONObject”的运行时类型。
标签: java android json recursion types