Как проверить тип значения из JSONObject?
Я пытаюсь получить тип значения, хранящегося в JSONObject
.
String jString = {"a": 1, "b": "str"};
JSONObject jObj = new JSONObject(jString);
Можно ли получить тип значения, хранящегося в ключе "a"
;
что-то вроде jObj.typeOf("a") = java.lang.Integer
?
Ответы
Ответ 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);
}
}
}