【问题标题】:JSON error with square brackets带方括号的 JSON 错误
【发布时间】:2012-11-26 06:44:39
【问题描述】:

我的 XML 文件看起来像这样

<Reading>
<Item Month="_October.xml">
    <kWhReading Firstday="1" />
    <kWhReading Lastday="552" />
</Item>
</Reading>

然后使用这行代码

JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( json.toString() );

我知道了

[{"@Month":"_October.xml","kWhReading":[{"@Firstday":"1"},{"@Lastday":"552"}]}]

然后,使用这个

JSONObject jsonobject = (JSONObject) jsonArray.get(0);

我知道了

{"@Month":"_October.xml","kWhReading":[{"@Firstday":"1"},{"@Lastday":"552"}]}

现在的问题是,我想使用 kWhReading 获取 Lastday 的值

JSONObject readingkWhLast = jsonobject.getJSONObject("kWhReading");

但它不起作用并引发异常

net.sf.json.JSONException: JSONObject["kWhReading"] is not a JSONObject.
at net.sf.json.JSONObject.getJSONObject(JSONObject.java:2058)
at com.syntronic.bean.RecentUsage.doPost(RecentUsage.java:82)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我很确定这与 FirstdayLastday 括起来的方括号有关,但我不知道如何删除它。任何人都可以在这里帮助我吗?

【问题讨论】:

  • 看起来kWhReadingJSONArray,而不是JSONObject
  • 是的,我也是这么想的,但我不知道如何访问数组以获取数组中的第二个值以存储到readingkWhLast

标签: java xml json


【解决方案1】:

从未使用过 JSON 库,但这应该是在正确的轨道上

JSONObject readingkWhLast = jsonobject.getJSONArray("kWhReading").get(1);

从您的 jsonobject 检索名为 "kWhReading"JSONArray,然后检索偏移量 1 处的元素(第二个对象)。

所有这些都在 API 文档中。您真的应该退后一步,彻底阅读文档,以便了解库的功能。

【讨论】:

  • 对不起,它仍然抛出与上面相同的异常,即“kWhReading”不是 JSONObject。
【解决方案2】:

一旦你得到 jsonArray:

[{"@Month":"_October.xml","kWhReading":[{"@Firstday":"1"},{"@Lastday":"552"}]}]

然后,您需要使用带有索引号的 getJSONObject() 来获取该数组中的元素。第二个是“kWhReading”,所以:

JSONObject kWhReadObject = jsonArray.getJSONObject(1);

这应该让你在这里:

{"kWhReading":[{"@Firstday":"1"},{"@Lastday":"552"}]}

要获取 kWhReading 的值(它本身就是一个数组):

JSONArray kWhReadArray = kWhReadObject.getJSONArray("kWhReading");

现在你在这里:

[{"@Firstday":"1"},{"@Lastday":"552"}]

返回索引号。同样,您想要第二个:

JSONObject lastDayObj = kWhReadArray.getJSONObject(1);

最后:

String lastDay = lastDayObj.getString("@Lastday");

文档在这里:http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多