不使用JSONObject,检查下一个令牌的类型是否为double、long或int。

5

我需要使用 JsonReaderHttpURLConnection 读取 JSON 响应。为了确定下一个令牌的类型,我使用了 JsonReader.peek() 方法,该方法返回一个 JsonToken。但是,我必须区分下一个令牌是 Java 的 doublelong 还是 int,以便可以使用 JsonReader.next*() 方法获取令牌,因为如果下一个令牌是 Java 的 doublelongint,则返回 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;
    }
}

有没有办法在不使用JSONObject的情况下检查下一个令牌的类型是double、long还是int?


@David 我该怎么做?在 try/catch 块中吗? - user5404864
对象 o = jsonReader.peek(); 如果 (o instanceof JSONObject) { //做一些事情 } - Vaibhav Kadam
@VaibhavKadam 你不行,o instanceof JSONObject 总是为假。 - user5404864
2
你可以通过使用double类型来几乎100%避免这个问题。为什么呢?因为int和long是相同的类型,long只是可以存储更大的数字,所以你可以忽略int。虽然不是所有的long都适合于double,但是任何小于2^52的数都可以完全适配,这几乎总是足够好的。 - Gabe Sechan
抱歉,不行。 - Miha_x64
显示剩余2条评论
1个回答

0

您可以使用nextString()将下一个数字读取为字符串,而JsonReader将在不失败的情况下返回它。然后,您可以根据此字符串是否包含.来选择longdouble之间的差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接