【问题标题】:JSONObject not a String ErrorJSONObject 不是字符串错误
【发布时间】:2015-07-28 05:31:09
【问题描述】:
    {
  "query": {
    "count": 1,
    "created": "2015-07-28T05:19:01Z",
    "lang": "en-US",
    "results": {
      "quote": {
        "symbol": "GITANJALI.NS",
        "Ask": null,
        "AverageDailyVolume": null,
        "Bid": null,
        "AskRealtime": null,
        "BidRealtime": null,
        "BookValue": null,
        "Change_PercentChange": null,
        "Change": null,
        "Commission": null,
        "Currency": null,
        "ChangeRealtime": null,
        "AfterHoursChangeRealtime": null,
        "DividendShare": null,
        "LastTradeDate": null,
        "TradeDate": null,
        "EarningsShare": "9.73",
        "ErrorIndicationreturnedforsymbolchangedinvalid": null,
        "EPSEstimateCurrentYear": null,
        "EPSEstimateNextYear": null,
        "EPSEstimateNextQuarter": null,
        "DaysLow": null,
        "DaysHigh": null,
        "YearLow": null,
        "YearHigh": null,
        "HoldingsGainPercent": null,
        "AnnualizedGain": null,
        "HoldingsGain": null,
        "HoldingsGainPercentRealtime": null,
        "HoldingsGainRealtime": null,
        "MoreInfo": null,
        "OrderBookRealtime": null,
        "MarketCapitalization": null,
        "MarketCapRealtime": null,
        "EBITDA": null,
        "ChangeFromYearLow": null,
        "PercentChangeFromYearLow": null,
        "LastTradeRealtimeWithTime": null,
        "ChangePercentRealtime": null,
        "ChangeFromYearHigh": null,
        "PercebtChangeFromYearHigh": null,
        "LastTradeWithTime": null,
        "LastTradePriceOnly": null,
        "HighLimit": null,
        "LowLimit": null,
        "DaysRange": null,
        "DaysRangeRealtime": null,
        "FiftydayMovingAverage": null,
        "TwoHundreddayMovingAverage": null,
        "ChangeFromTwoHundreddayMovingAverage": null,
        "PercentChangeFromTwoHundreddayMovingAverage": null,
        "ChangeFromFiftydayMovingAverage": null,
        "PercentChangeFromFiftydayMovingAverage": null,
        "Name": null,
        "Notes": null,
        "Open": null,
        "PreviousClose": null,
        "PricePaid": null,
        "ChangeinPercent": null,
        "PriceSales": null,
        "PriceBook": null,
        "ExDividendDate": null,
        "PERatio": null,
        "DividendPayDate": null,
        "PERatioRealtime": null,
        "PEGRatio": null,
        "PriceEPSEstimateCurrentYear": null,
        "PriceEPSEstimateNextYear": null,
        "Symbol": "GITANJALI.NS",
        "SharesOwned": null,
        "ShortRatio": null,
        "LastTradeTime": null,
        "TickerTrend": null,
        "OneyrTargetPrice": null,
        "Volume": null,
        "HoldingsValue": null,
        "HoldingsValueRealtime": null,
        "YearRange": null,
        "DaysValueChange": null,
        "DaysValueChangeRealtime": null,
        "StockExchange": null,
        "DividendYield": null,
        "PercentChange": null
      }
    }
  }
}

这是我得到的 Json,我正在尝试使用 MarketCapitalization 摆脱这种情况:

import org.json.JSONArray;
import org.json.JSONObject;

通过以下操作:

String marketCap = obj.getJSONObject("query").getJSONObject("results")
                .getJSONObject("quote").getString("MarketCapitalization");

但我收到以下错误

org.json.JSONException: JSONObject["MarketCapitalization"] not a string.
    at org.json.JSONObject.getString(JSONObject.java:658)
    at com.mobileforce.YahooClient.prepareReadCompany(YahooClient.java:136)
    at com.mobileforce.YahooClient.read(YahooClient.java:82)
    at com.mobileforce.YahooClient.handleApi(YahooClient.java:42)
    at com.mobileforce.YahooServlet.doPost(YahooServlet.java:44)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

注意:如果 MarketCapitalization 有一些价值,那么上面的工作就完全正常了。只有当它为空时才会出现问题

【问题讨论】:

    标签: java json


    【解决方案1】:

    如果存在则使用 optString() 获取值,否则为 null 或您定义的默认值:

    .optString("MarketCapitalization", "defaultValue");
    

    documentation

    【讨论】:

      【解决方案2】:

      尝试在使用前对null 进行一些主动检查,例如:

      jsonObj.isNull("MarketCapitalization"){
      
      //do something
      
      }
      

      【讨论】:

      • 非常感谢您的回答。帮助我保存带有可选值的详细信息...来自我的一票!
      【解决方案3】:

      您可以尝试getObject() 而不是getString(),然后检查是否为空。但这显然不是您正在使用的库的强项...

      【讨论】:

      • 不,它现在不起作用我收到以下错误 org.json.JSONException: JSONObject["MarketCapitalization"] is not a JSONObject.
      【解决方案4】:

      首先检查“MarketCapitalization”键的值是否为空 如果不为空,请完成您的工作

          JSONObject quoteJson = obj.getJSONObject("query").getJSONObject("results")
                  .getJSONObject("quote");
          if(quoteJson.get("MarketCapitalization")!=null)
          {
              //do your work
          }
      

      【讨论】:

        【解决方案5】:

        JSONObject 为每个数据字段接收一个数组,获取该数据并将其传输到另一个变量,例如使用字段名称作为引用的数组或字符串,例如'value','name'等...如果为null,则以白色传输一个值以避免错误。我喜欢这样...

        String value; 
        
        if(jsonObject.get("name").toString().equals("null")) {
          value = ""; 
        }else {
          value = jsonObject.getString("name"); 
        }
        

        【讨论】:

        • 欢迎来到 Stack Overflow。在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他有类似问题的用户有用。
        猜你喜欢
        • 1970-01-01
        • 2014-05-25
        • 2021-03-12
        • 2017-01-27
        • 2012-12-27
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多