【问题标题】:Nested array in JSONObject is returning as empty (org.json)JSONObject 中的嵌套数组返回为空(org.json)
【发布时间】:2020-12-31 11:23:08
【问题描述】:

我从 JSON 文件中获取了一个嵌套的 JSON 数组(“投资”),但当我尝试使用它时,该数组似乎为空。

我的 JSON 文件:

    {
"invested": [
    {
        "email" : "test@test.com",
        "password" : "test"
    }
],
"notInvested": [
    {
        "email" : "test@test.com",
        "password" : "test"
    }
]}

这是我从文件中获取 JSONObject 的方法:

public JSONObject returnJSONObject(String path) throws JSONException, IOException 
{
    path = System.getProperty("user.dir") + path;
    
    JSONObject obj = parseJSONFile(path);

    return obj;
}

public static JSONObject parseJSONFile(String filename) throws JSONException, IOException 
{
    String content = new String(Files.readAllBytes(Paths.get(filename)));
    Reporter.log(content);
    return new JSONObject(content);
}

这就是失败的地方。当我尝试调用'loginPage.login(loginArray.get(0).toString(), loginArray.get(1).toString());';

JSONObject validLogins = returnJSONObject("valid-user-logins.json");
JSONArray loginArray = (JSONArray) validLogins.get("invested");

// submit valid credentials
loginPage.login(loginArray.get(0).toString(), loginArray.get(1).toString());

我在运行程序时返回的错误是我的索引 0 超出了长度 0 的范围:

org.json.JSONException: JSONArray initial value should be a string or collection or array.

我对 JSON 很陌生,所以这仍然有点令人困惑,关于我做错了什么有什么想法吗?任何帮助将不胜感激!

编辑: 为了澄清起见,我试图从 json 文件中的“投资”数组中获取“电子邮件”和“密码”。

【问题讨论】:

    标签: java arrays json selenium


    【解决方案1】:

    您没有正确地从 JSON 数组中的对象中提取电子邮件和密码。

    loginArray 包含一个 JSON 数组,其中有一个元素,一个 JSON 对象。 loginArray.get(0) 具有以下值:

    {
        "email" : "test@test.com",
        "password" : "test"
    }
    

    当您想要提取此对象中各个属性的值时,您正试图将整个对象转换为字符串。

    要获取电子邮件地址,请使用loginArray.getJSONObject(0).getString("email")。这会将loginArray 中的第一个元素作为JSONObject 取出,然后将此JSONObjectemail 属性的值作为字符串读取。

    要获取密码,请使用loginArray.getJSONObject(0).getString("password")

    【讨论】:

    • 感谢您的帖子,但是我刚刚尝试了您的建议并完成了此操作:loginPage.login(loginArray.getJSONObject(0).getString("email"), loginArray.getJSONObject(0)。 getString("密码"));但是我仍然收到此错误:Index 0 out of bounds for length 0.
    • @bway:我没有得到IndexOutOfBoundsException 访问这些 JSON 值。请编辑您的问题以包含完整的堆栈跟踪:我怀疑您的 login() 方法存在与访问 JSON 值无关的单独问题。
    • 谢谢!原来在我的脚本中之前的一些东西把错误搞砸了。您的答案现在完美运行。
    【解决方案2】:

    您的示例文件中的数组每个仅包含一个元素。

    JSONArray investedArray = (JSONArray) validLogins.get("invested");
    JSONArray notInvestedArray = (JSONArray) validLogins.get("notInvested");
    

    JSON 提醒:

    object: { key : value, key : value, ... }
    array:  [ value, value, ... ]
    

    您的示例文件是:

    { key : array, key : array }
    

    { key : [ object ], key : [ object ] }
    

    【讨论】:

    • 每个元素一个? “投资”(电子邮件和密码)的内容不计入数组元素吗?如果不是,我怎么能从“投资”中抓住它们?
    • 键 'invested' 的值是一个包含 1 个元素(方括号之间的单个对象)的数组。如果有更多元素,它们将用逗号分隔。
    • 谢谢,我现在明白了。但是我已将我的 JSON 更改为:“invested”:[“test@test”,“test123!”] 我仍然得到同样的错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2015-04-18
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多