【问题标题】:Retrieving each key-value from String array object [duplicate]从字符串数组对象中检索每个键值
【发布时间】:2021-07-18 23:43:00
【问题描述】:

我有一个以下格式的字符串,并希望从中访问某些元素,例如主机/用户名。

{
 "username":"admin",
 "password":"admin1234",
 "engine":"mysql",
 "host":"toolsdata.us-east-1.rds.amazonaws.com",
 "port":3306,
 "dbname":"tools_data",
 "dbInstanceIdentifier":"toolsdata
}

我尝试使用List<String>String[] 检索值,但无法这样做。

还有其他方法可以从上面的字符串中获取每个元素吗?

【问题讨论】:

  • 你使用什么语言?
  • 我正在用 Java AREST 编写一个应用程序。

标签: java json string


【解决方案1】:

您可以使用org.json.JSONObject (https://mvnrepository.com/artifact/org.json/json) 类来访问键值功能。

要创建JSONObject,只需将JSON 值作为字符串传递给它的构造函数:

String jsonAsString = "Your JSON as string...";
JSONObject json = new JSONObject(jsonAsString);

现在您可以通过给定键轻松访问值:

json.getString("username");
json.getInt("port");

您可以在本教程中了解有关不同 JSON 解析方法的更多信息:How to Parse JSON in Java

【讨论】:

    【解决方案2】:

    包含 JSON 的字符串只是一个字符串。它不会神奇地被解析成其他任何东西。不分割成行,不解释为 Json,什么都没有。怎么会呢,Java 不知道它的内容,也不知道它对你有什么意义。

    因此,为了能够处理 JSON,您必须编写代码,将 JSON 标记化并将其解析为提供必要功能来访问其键和值的对象。

    有多个库提供这些功能。其中最有能力和最知名的是 Jackson 和 GSON,但对于像您这样简单的任务来说,它们可能是矫枉过正。像 JSONObject 这样更简单的库可能就足够了。

    主要区别在于:Jackson 或 GS​​ON 等 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2016-05-10
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      相关资源
      最近更新 更多