json - 从 Android 设备向服务器发送 JSON 消息

标签 json http servlets url-encoding

我有一个 Android 设备可以创建 JSON 格式的消息并将其发送到 Tomcat 服务器。服务器正在运行一个 Java Web 应用程序,该应用程序接收此 JSON 格式的消息并将对其进行处理。

我的问题是,当服务器接收到消息时,服务器会将某些字符('{'、'['、'"'、']' 和 '}')替换为十六进制表示形式,这会导致服务器无法识别消息的 JSON 错误。

我的问题是是否有人知道导致此问题的原因以及我将如何解决此问题(我确定这不是 JSON 代码,而是消息在发送/接收方面的处理方式)。

这是我的服务器端代码:

@Override
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Setup response
    PrintWriter out = response.getWriter();

    // Store input message as String
    StringBuilder sb = new StringBuilder();
    String message;

    // Build String
    while ((message = request.getReader().readLine()) != null) {
        sb.append(message);
    }

    // Full message as String
    message = sb.toString();

    // Convert message to JSON format
    Gson gson = new Gson();
    ImageFeatures features = gson.fromJson(message, ImageFeatures.class);

    out.println("Normal data: " + features);
    out.println();
}

这是我收到的错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 12
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
com.google.gson.Gson.fromJson(Gson.java:795)
com.google.gson.Gson.fromJson(Gson.java:761)
com.google.gson.Gson.fromJson(Gson.java:710)
com.google.gson.Gson.fromJson(Gson.java:682)

这是 Android 设备向服务器发送消息之前生成的 JSON 格式消息:

{
"image_x_size":800,
"image_y_size":1600,
"features":
    [
        {"cart_x":5.0,"cart_y":124.0,"polar_angle":0.0,"polar_dist":0.0,"size":15.0},
        {"cart_x":5.0,"cart_y":124.0,"polar_angle":0.0,"polar_dist":0.0,"size":15.0}
    ]
}

这是服务器看到消息的方式(即 message 字符串的内容):

%7B+%09%22image_x_size%22%3A800%2C+%09%22image_y_size%22%3A1600%2C+%09%22features%22%3A+%09%09%5B+%09%09%09%7B%22cart_x%22%3A5.0%2C%22cart_y%22%3A124.0%2C%22polar_angle%22%3A0.0%2C%22polar_dist%22%3A0.0%2C%22size%22%3A15.0%7D%2C+%09%09%09%7B%22cart_x%22%3A5.0%2C%22cart_y%22%3A124.0%2C%22polar_angle%22%3A0.0%2C%22polar_dist%22%3A0.0%2C%22size%22%3A15.0%7D+%09%09%5D+%7D+

如您所见,消息字符串具有替换某些字符的各种十六进制值。

非常感谢!

编辑:我认为我应该包括我的 Android 代码以进一步清晰

HttpClient http_client = new DefaultHttpClient();

// Set long timeout limit
HttpConnectionParams.setConnectionTimeout(http_client.getParams(), 10000);
HttpConnectionParams.setSoTimeout(http_client.getParams(), 10000);
HttpResponse response;

// Setup json_object
JSONObject json_object = convertImageFeaturesToJSON(data, x, y);

try {
HttpPost http_post = new HttpPost(URL_BASE + "/featureuploader");

Log.i(TAG, json_object.toString());

StringEntity se = new StringEntity(json_object.toString());
se.setContentType("application/json; charset=UTF-8");
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json; charset=UTF-8"));

http_post.setEntity(se);
http_post.setHeader("Accept", "application/json");
http_post.setHeader("Content-Type", "application/json");

response = http_client.execute(http_post);

if (response != null) {
    String response_string = httpResponseToString(response.getEntity().getContent());
    if (! response_string.startsWith("Received: <html>")) {
        Log.i(TAG, "Received: ERROR! - " + response_string.substring(0, 20));
    } else {
        Log.i(TAG, "Received: " + response_string);
    }
} else {
    Log.e(TAG, "Did not receive from server");
}               
} catch (Exception e) {
    Log.e(TAG, "Error: " + e.getMessage());
}

最佳答案

This is how the message is seen by the server...

这是您在服务器上看到的 JSON 的 URL 编码版本。您需要先解码它(使用类似 URLDecoder 的东西),或者以您解码后的方式从请求中检索它。

关于json - 从 Android 设备向服务器发送 JSON 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005044/

相关文章:

http - 从外部 Go 中间件控制 HTTP header

mysql - 如何使用 Roslyn 动态运行简单的 ODATA 查询并以 json 格式返回结果?

java - 如何使用 Java 解析具有不同键和值的 JSON 对象?

iphone - 移动设备收到 HTTP 504 错误

c# - C# AsyncCallback 是否创建一个新线程?

java - 在java servlet中解析html字符串

mysql - Vue JS 组件中来自 MySQL 的嵌套 JSON 求和

php - symfony json api for 循环为空

java - HttpServletResponse 如何到达发出请求的同一浏览器窗口

servlets - 在 ExtJs 中将参数传递给服务器