包含 JSON 的字符串只是一个字符串。它不会神奇地被解析成其他任何东西。不分割成行,不解释为 Json,什么都没有。怎么会呢,Java 不知道它的内容,也不知道它对你有什么意义。
因此,为了能够处理 JSON,您必须编写代码,将 JSON 标记化并将其解析为提供必要功能来访问其键和值的对象。
有多个库提供这些功能。其中最有能力和最知名的是 Jackson 和 GSON,但对于像您这样简单的任务来说,它们可能是矫枉过正。像 JSONObject 这样更简单的库可能就足够了。
主要区别在于:Jackson 或 GSON 等 JSON 序列化/反序列化库将已知的 Json 解析为用户定义的对象。如果 JSON 中的字段与您的 Java 对象中的字段不匹配,则它将不起作用。但是如果他们这样做了,您就可以对所有键进行类型安全的访问,并且可以像使用任何常规 Java 对象一样使用您的 Object。
JSONObject 之类的库的工作方式不同:它们不需要了解有关 JSON 对象的任何信息,它们将其解析为 Wrapper 对象,然后您可以查询数据。它们可以使用任何有效的 JSON 输入,但是如果您假设存在哪些键以及它们具有哪种类型,并且这些假设不成立,则在访问它们时可能会出错。所以,这里没有类型安全。
下面的代码不考虑任何库引发的潜在异常,也不包括任何空检查。
杰克逊:
class Settings {
String username;
String password;
String engine;
String host;
Integer port;
String dbname;
String dbInstanceIdentifier;
public static Settings fromJson (String jsonData) {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(jsonData, Settings.class);
}
}
GSON
class Settings {
String username;
String password;
String engine;
String host;
Integer port;
String dbname;
String dbInstanceIdentifier;
public static Settings fromJson (String jsonData) {
Gson gson = new Gson();
return gson.fromJson(jsonData, Settings.class);
}
}
JSON 对象:
class Settings {
String username;
String password;
String engine;
String host;
Integer port;
String dbname;
String dbInstanceIdentifier;
public static Settings fromJson (String jsonData) {
JSONObject json = new JSONObject(jsonData);
Settings newSettings = new Settings();
newSettings.username = json.getString("username");
newSettings.password = json.getString("password");
newSettings.engine = json.getString("engine");
newSettings.host = json.getString("host");
newSettings.port = json.getInt("port");
newSettings.dbname = json.getString("dbname");
newSettings.dbInstanceIdentifier = json.getString("dbInstanceIdentifier");
return newSettings;
}
}