【问题标题】:sending JSON array from android to servlet将 JSON 数组从 android 发送到 servlet
【发布时间】:2012-08-15 13:18:11
【问题描述】:

我在从 Android 发送 JSON Array 到 Servlet 时遇到问题。但我可以通过浏览器发送相同的JSON Array。我花了很多时间试图解决这个问题,但找不到解决方案。

URL = "http://192.168.*.*:8080/Test/TestServlet?q=add&array="

我在末尾添加了 JSON 数组:

[{"amount":"3","test":"test",...}]

GlassFish 服务器错误:

org.json.JSONException: A JSONArray text must start with '[' at character 0 of 

等待回复,谢谢。

Servlet:

protected void doPost(HttpServletRequest request,HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    String req = request.getParameter("q");


    try 
    {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver found");

        dbConnect = DriverManager.getConnection("jdbc:mysql://localhost/***",  
                                                       "root", "***");
        dbStatement = dbConnect.createStatement();

        if (req.equals("add")) {
            String json_array = request.getParameter("array");

            String query = null;
            org.json.JSONArray jArray = new org.json.JSONArray(json_array);
            for (int i = 0; i < jArray.length(); i++)
            {
              org.json.JSONObject obj = jArray.getJSONObject(i);
              query = 
                 "INSERT INTO *** (...) VALUES(" + obj.getInt("***") + ",'" +  
                 obj.getString("***") + "','" + obj.getString("***") + "','" +  
                 obj.getString("***") + "'," + obj.getDouble("***") + "," +  
                 obj.getDouble("***") + "," + obj.getDouble("***") + ",'" +  
                 obj.getString("***") + "','"+obj.getString("***")+"','','"+  
                 obj.getString("***") + "')";
            }

            dbStatement.executeUpdate(query);
    ...

安卓

protected void sendJson(JSONArray json) 
{
      HttpClient client = new DefaultHttpClient();
      HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
      HttpResponse response;
      try
      {
        HttpPost post = new HttpPost(URL);
        StringEntity se = new StringEntity(json.toString());  
        Log.i("JSON before sending", json.toString());

        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        post.setEntity(se);
        response = client.execute(post);

        /*Checking response */
        if(response!=null)
        {
          InputStream in = response.getEntity().getContent();   
          //Get the data in the entity
        }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
 }

【问题讨论】:

  • 当您在从 Android 发送的 servlet 中调试/pring json_array 时会看到什么?
  • 在 org.json.JSONArray 的 org.json.JSONTokener.syntaxError(JSONTokener.java:450)。(JSONArray.java:108) 在 org.json.JSONArray. (JSONArray.java:147) 在 TestServlet.doPost(TestServlet.java:114) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:688) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:第770章)
  • 不是这个。在 servlet 中有这一行 String json_array = request.getParameter(..。就在这之后,输入System.out.println(json_array) ,看看它会打印什么。
  • 我之前试过,它在那条线上崩溃了,所以没有要打印的消息。我猜是HTTP参数的问题。我可能应该在 Android 部分用这个“q=add&array=”做点什么,但我不确定具体如何。有什么建议吗?
  • 您正在使用代码中的 POST。尝试使用 GET。请参阅我的答案中的示例代码。

标签: java android servlets


【解决方案1】:

StringEntity 会将您的 [ { } ] 编码为 %5B %7B %7D %5D,servlet 上的 getParameter 在您将其交给 JsonArray 解析之前可能不会解码这些。因此,url 解码 servlet 上的参数可能是您正在寻找的解决方法。

【讨论】:

    【解决方案2】:

    在浏览器上,您正在尝试使用 GET 方法,而在您的代码中,您正在使用 POST 方法。尝试在您的代码中使用 GET 方法。以下是与HttpClient一起使用的GET方法示例

    GetMethod get = new GetMethod("http://www.example.com/page");
    method.setQueryString(new NameValuePair[] {
        new NameValuePair("q", "add"),
      new NameValuePair("array", "[{"amount":"3","test":"test"}]"),
    });
    

    然后使用client.execute(post);调用服务器。

    【讨论】:

    • 谢谢大家的回复。我决定这样做,它正在工作: List params = new ArrayList(); params.add(new BasicNameValuePair("array", json));尝试 { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = 新的 HttpPost(URL); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse httpResponse = httpClient.execute(httpPost); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2020-10-18
    • 2012-01-07
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多