Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

java.lang.ClassCastException: org.json.JSONObject$Null cannot be cast to java.lang.String

Ask Question

Exception is java.lang.ClassCastException : org.json.JSONObject$Null cannot be cast to java.lang.String

Printthis>>>>>>userName=user1&passKey=12345678 POST Response Code :: 200

jsonObj>>>>>>>>>>>>>>>>>>{"response":{"roleTitle":"Parent","roleId":146,"passKey":"12345678","id":1,"userName":"user1"},"errorCode":null,"error":false,"message":null}

Jan 04, 2018 4:33:11 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [spring-dispatcher] in context with path [/balihans] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: org.json.JSONObject$Null cannot be cast to java.lang.String] with root cause java.lang.ClassCastException: org.json.JSONObject$Null cannot be cast to java.lang.String at com.swasth.general.controller.SwasthController.postLogin(SwasthController.java:2274) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 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:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

Here is my postLogin code

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView postLogin(HttpServletRequest request,HttpServletRequest response) throws IOException, JSONException {
    ModelAndView addmodel = new ModelAndView("login");
    String uri = "http://localhost:8080/login/api/";
    URL url = new URL(uri);
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setRequestMethod("POST");
    String userName = request.getParameter("userName");
    String passKey = request.getParameter("passKey");
    con.setDoOutput(true);
    OutputStream os = con.getOutputStream();
    os.write(("userName=" + userName + "&passKey=" + passKey).getBytes());
    System.out.println("Printthis>>>>>>" + "userName=" + userName + "&passKey=" + passKey);
    os.flush();
    os.close();
    int responseCode = con.getResponseCode();
    System.out.println("POST Response Code :: " + responseCode);        
    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer responses = new StringBuffer();
    while ((inputLine = in.readLine()) != null) {
        responses.append(inputLine);
    //System.out.println("responses>>>>>>>>>>>"+responses);
    String str = responses.toString();
    JSONObject jsonObj = new JSONObject(str);
    System.out.println("jsonObj>>>>>>>>>>>>>>>>>>"+jsonObj);
    String res = (String)jsonObj.get("errorCode");
    // build a JSON object
    List<PatentLoginInfo> PatentLoginInfoArray = new ArrayList<PatentLoginInfo>();
    ObjectMapper mapper = new ObjectMapper();       
    RestTemplate restTemplate = new RestTemplate();
    String res11 = (String)jsonObj.get("response");
    String login = restTemplate.getForObject(uri, String.class);
    JSONObject obj = new JSONObject(login);
    JSONObject objects = obj.getJSONObject(res11);
    System.out.println("objects>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+objects);
    PatentLoginInfo patentLoginInfo = mapper.readValue(objects.toString(), PatentLoginInfo.class);
     PatentLoginInfoArray.add(patentLoginInfo);
    addmodel.addObject("theLogin", PatentLoginInfoArray);
    if (res.equals("BVE000403")) { // success
        addmodel = new ModelAndView("index");
        addmodel.addObject("login Unsucessfull","Password is invalid");
        return addmodel;
    else{
            addmodel = new ModelAndView("AnswerQuestion");
            addmodel.addObject("login sucessfull");
            return addmodel;
                Please see Minimal, Complete Verifiable Example and How to ask a good question to improve your question, so it is more likely to be answered.
– Jake Symons
                Jan 4, 2018 at 11:08

JSONObject has a specific inner constant for representing null objects: JSONObject.NULL

Before casting your JSONObject to a String, you may verify if it equals the NULL constant. Here an example:

//put words from JSON to array
for (int i = 0; i<wordsInJSONArray.length(); i++) {
    Object o = wordsInJSONArray.get(i);
    if (!JSONObject.NULL.equals(o)) {
        String word = (String) o;
        this.wordsArray[i] = word;
                Could one use == instead of .equals()? If JSONObject.NULL constant is represented by a single Object, then, all null objects in json would reference that object, wouldn't they?
– parsecer
                Feb 12, 2019 at 16:34

You could also use isNull()

Returns true if the associated value for the specified name is JsonValue.NULL. More here

So your code would be:

String code = jsonObj.isNull("errorCode") ? "" : jsonObj.getJsonString("errorCode");

It seems that "errorCode" is null from your print :

{"roleTitle":"Parent","roleId":146,"passKey":"12345678","id":1,"userName":"user1"},"errorCode":null,"error":false,"message":null}

So you need to check on null before casting to string

String res = (String)jsonObj.get("errorCode");

so apply the following validation and it will work :

String res = null;
if (!org.json.JSONObject.NULL.equals(jsonObj.opt("errorCode")) && jsonObj.getString("errorCode") != null) {
    res = jsonObj.getString("errorCode");
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.