Java 在不使用JSONObject的情况下,检查下一个标记的类型是double、long还是int
我需要使用Java 在不使用JSONObject的情况下,检查下一个标记的类型是double、long还是int,java,android,json,Java,Android,Json,我需要使用JsonReader从HttpURLConnection读取JSON响应。为了找出下一个标记的类型,我使用了方法,该方法返回一个。但是,我必须区分下一个令牌是Javadouble、long还是int,这样我就可以使用JsonReader.next*()方法获取令牌,因为如果下一个令牌是Javadouble、long或int,则返回NUMBER。以下是我的代码: final Map<String, Object> results = new HashMap<>()
JsonReader
从HttpURLConnection
读取JSON响应。为了找出下一个标记的类型,我使用了方法,该方法返回一个。但是,我必须区分下一个令牌是Javadouble
、long
还是int
,这样我就可以使用JsonReader.next*()
方法获取令牌,因为如果下一个令牌是Javadouble
、long
或int
,则返回NUMBER
。以下是我的代码:
final Map<String, Object> results = new HashMap<>();
while (jsonReader.hasNext()) {
final String name = jsonReader.nextName();
switch (jsonReader.peek()) {
case BOOLEAN:
results.put(name, jsonReader.nextBoolean());
break;
case NAME:
results.put(name, jsonReader.nextName());
break;
case NULL:
results.put(name, null);
break;
case NUMBER:
// results.put(name, jsonReader.nextInt()); TODO: Find out how to differentiate between int, long and double
break;
case STRING:
results.put(name, jsonReader.nextString());
break;
default:
jsonReader.skipValue();
break;
}
}
final Map results=new HashMap();
while(jsonReader.hasNext()){
最终字符串名称=jsonReader.nextName();
开关(jsonReader.peek()){
大小写布尔值:
results.put(名称,jsonReader.nextBoolean());
打破
案例名称:
results.put(name,jsonReader.nextName());
打破
大小写为空:
results.put(name,null);
打破
案件编号:
//results.put(name,jsonReader.nextInt());TODO:了解如何区分int、long和double
打破
大小写字符串:
put(name,jsonReader.nextString());
打破
违约:
jsonReader.skipValue();
打破
}
}
在不使用JSONObject的情况下,是否仍要检查下一个标记的类型是double、long还是int?您可以使用
nextString()
将下一个数字作为字符串读取,并且JsonReader
将返回它而不会失败。然后,您可以根据此字符串是否包含
long
和double
之间进行选择?在try/catch块中?对象o=jsonReader.peek();如果(o instanceof JSONObject){//do things}@VaibhavKadam您不能,o instanceof JSONObject
总是false@marshmallow对象o=jsonReader.peek();如果(o instanceof Double){//do things},使用Double几乎可以100%避免这个问题。为什么?int和long是同一种类型,long也可以存储更大的数字,因此可以忽略int。虽然并非所有long都适合于double,但小于2^52的任何值都会完全适合,这几乎总是足够好的。