57

我正在尝试获取存储在JSONObject.

String jString = {"a": 1, "b": "str"};
JSONObject jObj = new JSONObject(jString);

是否可以获取存储在 key 的值的类型"a";像jObj.typeOf("a") = java.lang.Integer什么?

4

6 回答 6

84

您可以借助JSONObject.get()方法从 JSON 中获取对象,然后使用instanceof运算符检查对象的类型。

这些线上的东西: -

String jString = "{\"a\": 1, \"b\": \"str\"}";
JSONObject jObj = new JSONObject(jString);
Object aObj = jObj.get("a");
if (aObj instanceof Integer) {
    // do what you want
}
于 2013-04-10T08:06:22.823 回答
8

最好的解决方案是JSONObject.get()使用运算符并检查类型instanceof

于 2013-04-10T08:03:39.687 回答
3

请注意,它JSONObject.get()可能会返回一个整数 ,例如,java.lang.Integer我们看到java.lang.Long{a:3,b:100300000000}

D/+++     ( 5526): +++a=>class java.lang.Integer:3
D/+++     ( 5526): +++b=>class java.lang.Long:100300000000

我使用类似的代码(请注意,我们使用类型longanddouble而不是intand float,并且在我的任务中可能没有嵌套JSONObjectJSONArray不支持它们):

    for (String k : new AsIterable<String>(json.keys())) {
            try {
                    Object v = json.get(k);
        //Log.d("+++","+++"+k+"=>"+v.getClass()+":"+v);
                    if (v instanceof Integer || v instanceof Long) {
                            long intToUse = ((Number)v).longValue();
                            ...
                    } else if (v instanceof Boolean) {
                            boolean boolToUse = (Boolean)v).booleanValue();
                            ...
                    } else if (v instanceof Float || v instanceof Double) {
                            double floatToUse = ((Number)v).doubleValue();
                            ...
                    } else if (JSONObject.NULL.equals(v)) {
                            Object nullToUse = null;
                            ...
                    } else {
                            String stringToUse = json.getString(k);
                            ...
                    }
            } catch (JSONException e2) {
                    // TODO Auto-generated catch block
                    Log.d("exc: "+e2);
                    e2.printStackTrace();
            }
    }

whereAsIterable让我们将for(:)循环与迭代器一起使用,并定义为:

public class AsIterable<T> implements Iterable<T> {
    private Iterator<T> iterator;
    public AsIterable(Iterator<T> iterator) {
        this.iterator = iterator;
    }
    public Iterator<T> iterator() {
        return iterator;
    }
}
于 2015-03-19T11:06:35.243 回答
3

我发现这种方法可以在 JSON / Json 中查找元素值的数据类型。它对我来说工作得很好。

JSONObject json = new JSONObject(str);
                Iterator<String> iterator = json.keys();

                if (iterator != null) {
                    while (iterator.hasNext()) {
                        String key = iterator.next();
                        Object value = json.get(key);
                        String dataType = value.getClass().getSimpleName();

                        if (dataType.equalsIgnoreCase("Integer")) {
                            Log.i("Read Json", "Key :" + key + " | type :int | value:" + value);

                        } else if (dataType.equalsIgnoreCase("Long")) {
                            Log.i("Read Json", "Key :" + key + " | type :long | value:" + value);

                        } else if (dataType.equalsIgnoreCase("Float")) {
                            Log.i("Read Json", "Key :" + key + " | type :float | value:" + value);

                        } else if (dataType.equalsIgnoreCase("Double")) {
                            Log.i("Read Json", "Key :" + key + " | type :double | value:" + value);

                        } else if (dataType.equalsIgnoreCase("Boolean")) {
                            Log.i("Read Json", "Key :" + key + " | type :bool | value:" + value);

                        } else if (dataType.equalsIgnoreCase("String")) {
                            Log.i("Read Json", "Key :" + key + " | type :string | value:" + value);

                        }
                    }
                }
于 2019-04-12T10:41:28.020 回答
1

instanceof不适合我。在最新版本中动态获取字段的数据类型,而不是使用JSONObject.get你可以做的就是JsonPrimitive像这样获取它

JsonPrimitive value = json.getAsJsonPrimitive('key');

现在你可以打电话

value.isNumber() value.isBoolean() value.isString()

于 2020-11-12T08:51:20.183 回答
0

您可以将所有数据解析为String,然后尝试将其转换为所需的类型。此时您可能会捕获异常并确定解析数据的类型。

于 2013-04-10T08:07:09.120 回答