【问题标题】:Getting type of value in a JSONObject in Android, to display the object's structure在Android中获取JSONObject中的值类型,以显示对象的结构
【发布时间】:2015-02-25 03:20:48
【问题描述】:

在 Android 中,JSONObject.get(key) 返回一个对象的值。我想根据其包含的数据类型对每个值进行不同的处理。

在我的准系统测试中,我在与 AndroidManifest.xml 相同的文件夹中名为 assets 的文件夹中有一个这样的 JSON 文件:

{ 
  "string": "example"
, "object": {
    "zero": 0
  , "one": 1
  , "two": 2
  }
}

这定义了不同类型的值(stringobjectinteger)。

在我的 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


【解决方案1】:

您可以尝试instanceOf 或尝试obj.optJSONObject(key),如果实例不是 JsonObject,则返回 jsonObject 或 null。请注意它的代码是:

/**
 * Returns the value mapped by {@code name} if it exists and is a {@code
 * JSONObject}, or null otherwise.
 */
public JSONObject optJSONObject(String name) {
    Object object = opt(name);
    return object instanceof JSONObject ? (JSONObject) object : null;
}  

这与 instanceOf 相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多