【问题标题】:Value <html><head><title>Apache of type java.lang.String cannot be converted to JSONObjectjava.lang.String 类型的值 <html><head><title>Apache 无法转换为 JSONObject
【发布时间】:2015-07-19 09:04:05
【问题描述】:

我正在将 json 从 servlet 发送到 android 应用程序,并且发生以下异常:-

 org.json.JSONException: Value <html><head><title>Apache of type java.lang.String cannot be converted to JSONObject

以下是我的 servlet 代码,如果这里有任何问题,请纠正我:-

public class LoginCheck extends HttpServlet {

  protected void processRequest(HttpServletRequest request,  HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/json;charset=UTF-8");
    PrintWriter out = response.getWriter();


    JSONObject obj1 = new JSONObject();

    long uname =Long.parseLong(request.getParameter("mobile"));
    String pwd = request.getParameter("pass");

    try  {
    Connection con = new MyConnection().connect();
    PreparedStatement ps = con.prepareStatement("select * from bmt_user  where mobile_num=? and password=?");
    ps.setLong(1,uname);
    ps.setString(2,pwd);

     ResultSet rs=ps.executeQuery();

        if(rs.next())
       {
            obj1.accumulate("login","Success");
            out.println(obj1.toString());

       }

        else
        {
            obj1.accumulate("login","Fail");
            out.println(obj1.toString());
        }
       out.write(obj1.toString());     
    }catch(Exception e){out.println(e.toString());}
  }


  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
     processRequest(request, response);
   }

   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
     processRequest(request, response);
  }

 }

另外,当我直接将值分配给 uname 和 pwd 时,不使用 request.getParameter() ,servlet 运行得很好并返回 json 即

long uname = 48372984;
String pwd = "fabcd"

输出 -

{"login":"Fail"}

【问题讨论】:

  • 您是否阅读过异常...显然不是...来自服务器的响应( Apache...) 不是json 字符串 ...
  • 我读得很好,我知道在这种情况下它没有返回 json,我只是不知道问题出在哪里。这就是为什么我在直接赋值时给出示例,然后它返回json。
  • 我假设您在 android 应用程序中遇到异常? 异常中的 Apache 在将请求发布到服务器时看起来像是收到了一些 Apache 错误页面。
  • @Selvin 我知道 ( Apache...) 不是 json ,我只是在响应中看不到它来自哪里
  • 尝试在浏览器中调用您的servlet,并将“mobile”和“pass”参数作为get 参数发布...看看您是否获得Json 或errorpage。如果出现错误页面,请检查 http 日志。

标签: java android json servlets jsonexception


【解决方案1】:

您的 servlet 代码引发了一个未捕获的异常,该异常最终出现在 HTML 风格的服务器默认 HTTP 500 错误页面中,如果是 Apache Tomcat 服务器,则具有以下标头:

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.21 - Error report</title>

这就解释了为什么客户端的 JSON 解析器会翻转它。尝试在普通的网络浏览器中重现相同的内容,您将看到完整的 HTML 错误页面。

问题很可能出在下面一行:

long uname = Long.parseLong(request.getParameter("mobile"));

您无法在此处预先检查/捕捉潜在的NullPointerException 和NumberFormatException。阅读服务器日志并相应地修复代码。也许参数名称是错误的?您的局部变量名为uname,它与请求参数名称mobile 不匹配。

【讨论】:

  • 准确!!但之前我做了一个servlet,使用相同的解析语句,执行得很好。
  • 如果它在当前的servlet 中出现,你就不会问这个问题了:) 此外,当客户端发送带有错误参数值的错误请求时,它仍然会失败。你应该已经返回了 HTTP 400 错误。
  • 是的,但我只传递一个长数据类型,不用担心它的意义,它是正确的。
  • 答案在服务器日志中的实际异常+trace中。去读吧。
  • 谢谢,通过阅读服务器日志解决了。看起来传递了一个空值,问题出在客户端,我在 BasicNameValuePair 中传递了一个变量 在 android 中更改了以下代码: - mob = et1.getText().toString() ; userLogin.add(new BasicNameValuePair("mobile",mob)); 到 userLogin.add(new BasicNameValuePair("uname",et1.getText().toString()));
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多