使用Java解析有效的JSON时出现异常

3

我有一个JSON字符串:

{
    "_id": -1,
    "create_date": 0,
    "update_date": 0,
    "description": "test",
    "active": true
}

在Java中,我尝试使用org.json.simple.parser.JSONParser来解析它:

JSONParser jsonParser = new JSONParser();
org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject) jsonParser.parse(phoneJSON);

我尝试检索_id字段的值:
String s_id = ((String) jsonObject.get("_id"));

但是遇到了以下异常:
java.lang.Long cannot be cast to java.lang.String

此外,如果我在控制台中显示字段值:
System.out.println("print value -  _id: "+jsonObject.get("_id"));

I get:

print value -  _id: -1

在控制台输出。

我看到了这篇文章:

java.lang.Long cannot be cast to java.lang.String

但它对我没有帮助。

我理解错了什么?


你不是在寻找String.valueOf(long)吗? - itwasntme
4个回答

2
问题不在解析过程中,而在于以下代码行的转换过程:
String s_id = ((String) jsonObject.get("_id"));

jsonObject.get("_id")返回一个java.lang.Long,正如错误所指定的那样,你后来将其强制转换为String

你可以通过以下方式解决这个问题:

String s_id = jsonObject.get("_id").toString();

在Java中,(String)不是一种转换,而是一种向下转型。由于String不是Long的子类,因此会出现错误。但是您可以调用.toString()Long转换为文本表示形式。
原因是:
System.out.println("print value -  _id: "+jsonObject.get("_id"));

这段代码之所以起作用,是因为如果你将一个对象"添加"到一个字符串中,toString方法会自动调用。实际上你已经隐式地写出了以下代码:

System.out.println("print value -  _id: "+Objects.toString(jsonObject.get("_id")));

2
你需要使用 .toString() 方法将 Long 类型转换为字符串。
String strLong = Long.toString(jsonObject.get("_id")));

参考文献:

返回一个表示此 Long 值的 String 对象。

另外,println 在控制台输出值的原因是因为 PrintStream.println 有一个重载方法接收一个 Object,然后调用它的 toString 方法。


1
当你使用 jsonObject.get("_id") 时,_id 的值会被正确地识别为 Long 类型(例如,在本例中为 -1)。
如果你想要一个字符串,请使用 jsonObject.getString("_id")

一个字符串应该能够容纳任何长整型或整型数据。为什么会出现异常? - Roy Hinkley
在Java中并不是这样,它们有不同的类。你可以在它们之间进行转换,例如:Integer.valueOf(<string>) 或 Integer.toString(<int>)。 - Robert
@AndroidAddict:因为Java不支持重载的强制类型转换运算符。在C#中,你可以这样做。但是,在Java中,(String)转换只意味着向下转型(而不是转换),由于你不能将Long向下转型为String,所以会出错。 - Willem Van Onsem
我想将长整型数值表示为字符串。我经常这样做,为什么我在这里不能这样做?我真的很困惑! - Roy Hinkley
你可以将整数表示为字符串,尝试使用 jsonObject.getString("_id")。 - Robert

1

为什么您期望“_id”字段是一个字符串?

它的值为-1(与“-1”相反),因此实际上它是Long而不是String。

但是,如果您需要字符串,可以通过转换进行强制转换。

String s_id = String.valueOf(jsonObject.get("_id"));

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