【问题标题】:Trying to get a JSONArray out of a JSONObject fails尝试从 JSONObject 中获取 JSONArray 失败
【发布时间】:2018-05-15 03:30:21
【问题描述】:

我正在使用 Spark 在 Java 中编写 API(与我的问题无关,但提供了一些上下文)。 我有以下 JSON(与我的后端返回的完全相同):

{"CfgCampaign":{"callingLists":{"CfgCallingListInfo":{"callingListDBID":{"value":126},"share":{"value":10},"isActive":{"value":2}}},"xmlns":"http://schemas.genesyslab.com/Protocols/Configuration/ConfServer/2005/","DBID":{"value":101},"name":{"value":"WI_Camp_1"},"state":{"value":1},"campaignGroups":{"CfgCampaignGroupInfo":[{"groupType":{"value":5},"dialerDBID":{"value":0},"optMethodValue":{"value":80},"origDNDBID":{"value":0},"numOfChannels":{"value":10},"groupDBID":{"value":826},"isActive":{"value":2},"scriptDBID":{"value":0},"trunkGroupDNDBID":{"value":0},"operationMode":{"value":1},"dialMode":{"value":2},"statServerDBID":{"value":176},"optRecBuffSize":{"value":6},"optMethod":{"value":1},"minRecBuffSize":{"value":4}},{"groupType":{"value":5},"dialerDBID":{"value":0},"optMethodValue":{"value":80},"origDNDBID":{"value":0},"numOfChannels":{"value":10},"groupDBID":{"value":827},"isActive":{"value":2},"scriptDBID":{"value":0},"trunkGroupDNDBID":{"value":0},"operationMode":{"value":1},"dialMode":{"value":2},"statServerDBID":{"value":176},"optRecBuffSize":{"value":6},"optMethod":{"value":1},"minRecBuffSize":{"value":4}}]},"scriptDBID":{"value":0},"tenantDBID":{"value":101}}}

这似乎是有效的,根据https://jsonlint.com/ 我将它作为 JSONObject 存储在我的代码中(所以基本上,上面是 toString() 的结果)。 但是,当我尝试在 JSONArray 中提取“campaignGroups”时,我得到:

org.json.JSONException: JSONObject["campaignGroups"] not found.

我实际上得到了这个错误,即使只是试图获取任何密钥,例如调用 get("DBID") 将返回相同的错误。

我对这里发生的事情有点困惑,如果有任何帮助,我们将不胜感激。

编辑:因为只有从异常中才能明显看出,所以我使用的是 json.org

谢谢!

【问题讨论】:

    标签: java json


    【解决方案1】:

    我相信您遇到的错误是由于包含其余数据的外部 JSON 对象“CfgCampaign”造成的。下面显示了一些关于如何使用 org.json 库解决此问题的示例代码:

    // Loads the JSON (assuming you provide it as a string).
    JSONObject x = new JSONObject(...);
    // Gets and stores a reference to the outer object.
    JSONObject y = x.getJSONObject("CfgCampaign");
    // Now you can access any of the nested fields as follows.
    JSONObject z = y.getJSONObject("campaignGroups");
    

    【讨论】:

    • 嗯,没错。非常感谢。我想我学到了一些东西。我没有区分包含实际对象的 JSON 对象。
    【解决方案2】:

    在该对象上调用 toString() 应该返回一个类似于“[Object Object]”的字符串,如果必须在其上调用 toString 方法,那么您还需要调用 JSON.parse(your_object_here)在它上面访问属性。

    此外,您似乎需要查找 your_object_name.CfgCampaign.campaignGroups 或 your_object_name["CfgCampaign"]["campaignGroups",但如果没有您用于访问campaignGroups 的代码,就很难分辨。

    如果你设置类似

    const obj = {"CfgCampaign":{"callingLists":{"CfgCallingListInfo":{"callingListDBID":{"value":126},"share":{"value":10},"isActive":{"value":2}}},"xmlns":"http://schemas.genesyslab.com/Protocols/Configuration/ConfServer/2005/","DBID":{"value":101},"name":{"value":"WI_Camp_1"},"state":{"value":1},"campaignGroups":{"CfgCampaignGroupInfo":[{"groupType":{"value":5},"dialerDBID":{"value":0},"optMethodValue":{"value":80},"origDNDBID":{"value":0},"numOfChannels":{"value":10},"groupDBID":{"value":826},"isActive":{"value":2},"scriptDBID":{"value":0},"trunkGroupDNDBID":{"value":0},"operationMode":{"value":1},"dialMode":{"value":2},"statServerDBID":{"value":176},"optRecBuffSize":{"value":6},"optMethod":{"value":1},"minRecBuffSize":{"value":4}},{"groupType":{"value":5},"dialerDBID":{"value":0},"optMethodValue":{"value":80},"origDNDBID":{"value":0},"numOfChannels":{"value":10},"groupDBID":{"value":827},"isActive":{"value":2},"scriptDBID":{"value":0},"trunkGroupDNDBID":{"value":0},"operationMode":{"value":1},"dialMode":{"value":2},"statServerDBID":{"value":176},"optRecBuffSize":{"value":6},"optMethod":{"value":1},"minRecBuffSize":{"value":4}}]},"scriptDBID":{"value":0},"tenantDBID":{"value":101}}}
    

    然后要在campaignGroups 中获取数组,您需要如下所示:

    obj.CfgCampaign.campaignGroups
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2016-05-24
      • 1970-01-01
      相关资源
      最近更新 更多