如何将JSON解析为整数?

25

我已经解析了一些JSON数据,只要将它存储在字符串变量中,它就可以正常工作。

我的问题是,我需要将ID存储在一个整数变量中,而不是字符串中。 我尝试过进行强制类型转换 int id = (int) jsonObj.get("");

但它会报错,提示我无法将对象转换为整数。 所以我尝试使用以下方式进行转换:

String id = (String) jsonObj.get("id");
int value = Integer.parseInt(id);

但是它也不起作用。出了什么问题? JSON 如何使用 int?我的字符串正常工作,只有当我尝试将它们转换为整数时才会遇到问题。

这是我的代码:

public void parseJsonData() throws ParseException {

        JSONParser parser = new JSONParser();
        Object obj = parser.parse(jsonData);
        JSONObject topObject = (JSONObject) obj;
        JSONObject locationList = (JSONObject) topObject.get("LocationList");
        JSONArray array = (JSONArray) locationList.get("StopLocation");
        Iterator<JSONObject> iterator = array.iterator();

        while (iterator.hasNext()) {

            JSONObject jsonObj = (JSONObject) iterator.next();
            String name  =(String) jsonObj.get("name");
            String id = (String) jsonObj.get("id");
            Planner.getPlanner().setLocationName(name);
            Planner.getPlanner().setArrayID(id);


        }

    }
8个回答

28

你可以使用parseInt函数:

int id = Integer.parseInt(jsonObj.get("id"));

或者更好、更直接的方式是使用getInt方法:

int id = jsonObj.getInt("id");

你是什么意思?你的 id 字符串里具体包含什么? - Denys Séguret
当您执行 String id = (String) jsonObj.get("id"); 时,您的 ID 字符串的精确值是什么? - Denys Séguret
对我来说,错误是无法将长整型转换为 int 值,例如 33。 - Muhammad Umer
如果您正在使用Java 8.0 jsonParser(就像我一样),而不是jsonObject,并且没有getInt方法,那么您还需要像上面提到的那样强制转换为字符串,因此唯一有效的方法将如下所示:int id = Integer.parseInt((String)jsonObj.get("id"));这在紧急情况下为我节省了时间,希望其他人也会发现它有用。 - Gadesxion
2
API已更新。现在代码应该读作:int id = jsonObj.get("id").asInt(); - rickrizzo
显示剩余2条评论

14

这取决于你正在解析的属性类型。

如果JSON属性是一个数字(例如5),你可以直接将其转换为Long类型,因此你可以执行以下操作:

(long) jsonObj.get("id") // with id = 5, cast `5` to long 

获取长整型后,您可以将其转换回整型,结果为:

(int) (long) jsonObj.get("id")
如果 JSON 属性是带引号的数字(例如 "5"),那么它被视为字符串,您需要执行类似于 Integer.parseInt() 或 Long.parseLong() 的操作。
Integer.parseInt(jsonObj.get("id")) // with id = "5", convert "5" to Long

唯一的问题是,如果有时您以字符串或数字形式接收id(您无法预测客户端的格式或者它们是可互换的),您可能会遇到异常,尤其是如果您在空json对象上使用parseInt / Long。

如果不使用Java泛型,我处理这些运行时异常的最佳方法是:

if(jsonObj.get("id") == null) {
   // do something here
}

int id;
try{
    id = Integer.parseInt(jsonObj.get("id").toString());
} catch(NumberFormatException e) {
  // handle here
}

你还可以删除第一个if语句,并将异常添加到catch中。

希望这能帮到你。


我使用这个一行语句,它可以工作得相当好: int TotalMiles = ((json_obj.has("TotalMiles")) ? ((json_obj.get("TotalMiles").equals("")) ? 0 : json_obj.getInt("TotalMiles")) : 0); 它不能解决发送了一个 string 的根本问题,但它确实覆盖了缺失、空值和空白字符 (在我的经验中)通常是问题所在。你可以在其中添加一个 parseInt 但它有点难以控制。 - Mr Heelis

5
非常简单。
示例JSON:
{
   "value":1
}


int z = jsonObject.getInt("value");

4

对我都没有用。 我尝试了以下方法,这个方法有效:

将其编码为json格式:

JSONObject obj = new JSONObject();
obj.put("productId", 100);

解码:

long temp = (Long) obj.get("productId");

0

这个问题有点老了,但是我创建了一个函数来将一个对象从字符串变量转换为整数的Json字符串,并取得了不错的结果。

function getInt(arr, prop) {
    var int;
    for (var i=0 ; i<arr.length ; i++) {
        int = parseInt(arr[i][prop])
            arr[i][prop] = int;
    }
    return arr;
  }

这个函数只需遍历数组并将所选对象的所有元素作为整数返回。


0

对于 JsonNode,请使用:Integer.parseInt(String.valueOf())


0

我使用json.get()和instanceof的组合来读取可能是整数或整数字符串的值。

以下三个测试用例说明了这一点:

int val;
Object obj;
JSONObject json = new JSONObject();
json.put("number", 1);
json.put("string", "10");
json.put("other", "tree");

obj = json.get("number");
val = (obj instanceof Integer) ? (int) obj : (int) Integer.parseInt((String) obj);
System.out.println(val);

obj = json.get("string");
val = (obj instanceof Integer) ? (int) obj : (int) Integer.parseInt((String) obj);
System.out.println(val);

try {
    obj = json.get("other");
    val = (obj instanceof Integer) ? (int) obj : (int) Integer.parseInt((String) obj);
} catch (Exception e) {
    // throws exception
}

0

这是我唯一有效的方法:

id = ((Long) jsonObj.get("id")).intValue();

这是因为 JSON 数字值只能是 Long 类型。


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