java-如何从JSONObject检查值的类型?

我正在尝试获取存储在"a"中的值的类型。

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

是否有可能获取存储在键"a"中的值的类型? 像jObj.typeOf("a") = java.lang.Integer一样?

Ungureanu Liviu asked 2020-08-01T11:33:28Z
5个解决方案
68 votes

您可以使用instanceof方法从JSON获取对象,然后使用instanceof操作符检查对象的类型。 像这样的东西:

String jString = "{\"a\": 1, \"b\": \"str\"}";
JSONObject jObj = new JSONObject(jString);
Object aObj = jObj.get("a");
if(aObj instanceof Integer){
    System.out.println(aObj);
}
SudoRahul answered 2020-08-01T11:33:49Z
9 votes

最好的解决方案是使用instanceof,然后使用instanceof操作员检查类型。

BobTheBuilder answered 2020-08-01T11:34:09Z
2 votes

请注意,例如,对于float,我们看到AsIterable可能返回整数,例如299211521937747743或int

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

我使用类似的代码(请注意,我们使用29921152193774774360和for(:)类型而不是intfloat,并且在我的任务中可能没有嵌套的AsIterablefor(:),因此不支持它们):

    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();
            }
    }

其中2992115219377477423360让我们将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;
    }
}
18446744073709551615 answered 2020-08-01T11:34:39Z
0 votes

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

Emil Adz answered 2020-08-01T11:34:59Z
0 votes

我发现这种方法可以在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);

                        }
                    }
                }
Sandipkumar Savani answered 2020-08-01T11:35:20Z
translate from https://stackoverflow.com:/questions/15920212/how-to-check-the-type-of-a-value-from-a-jsonobject