Подтвердить что ты не робот

Как проверить тип значения из JSONObject?

Я пытаюсь получить тип значения, хранящегося в JSONObject.

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

Можно ли получить тип значения, хранящегося в ключе "a";  что-то вроде jObj.typeOf("a") = java.lang.Integer?

4b9b3361

Ответ 1

Вы можете получить объект из JSON с помощью метода get(), а затем использовать оператор 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);
}

Ответ 2

Лучшее решение - использовать JSONObject.get() и проверить тип с помощью оператора instanceof.

Ответ 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

Я использую такой код (обратите внимание, что мы используем типы long и double вместо int и float, а в моей задаче может быть нет вложенных JSONObject или JSONArray, чтобы они не поддерживались):

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

где AsIterable позволяет использовать цикл 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;
    }
}

Ответ 4

Вы можете проанализировать все данные как String, а затем попытаться преобразовать их в нужный тип. На этом этапе вы можете поймать исключение и определить, какой тип является проанализированными данными.

Ответ 5

Я нашел этот способ найти тип данных значения элемента в 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);

                        }
                    }
                }