Java使用转义双引号在POST请求中发送JSON字符串

时间:2012-06-25 18:33:10

标签: java android json http-post

  

可能重复:
  How can I stop HTTP from escaping quotes?

我正在创建一个JSONObject并将JSON字符串发送到POST请求正文中的服务器。

public String toJson() {
    JSONObject filter = new JSONObject();
    try {
        filter.put("gender", gender.getCode());
        filter.put("feature_id", productCategory);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JSONObject filterObject = new JSONObject();
    try {
        filterObject.put("filter", filter);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return filterObject.toString();
}

所以我正在创建一个请求:

private IJsonExecutorInterface requestExecutorForRelativePathAndParams(String path, WebParams params) throws UnsupportedEncodingException {
    HttpPost postRequest = new HttpPost(rootUrl + path);

    if(params != null) {
        postRequest.setHeader("content-type", params.getContentType());
        postRequest.setEntity(params.getFormEntity());
    }

    // Blah blah

    return executor;
}

public IJsonExecutorInterface getProducts(ProductFilter filter, int offset, int limit) throws UnsupportedEncodingException {
    WebParams webParams = new WebParams();
    webParams.addPair("filter", filter.toJson());
    webParams.addPair("offset", String.format("%d", offset));
    webParams.addPair("limit", String.format("%d", limit));
    return requestExecutorForRelativePathAndParams("products", webParams);
}

// WebParams class


public class WebParams {
    private ArrayList<NameValuePair> params;
    private String contentType = "application/x-www-form-urlencoded";

    public WebParams() {
        params = new ArrayList<NameValuePair>();
    }

    public void addPair(String name, String value) {
        params.add(new BasicNameValuePair(name, value));
    }

    public String getContentType() {
        return contentType;
    }

    public HttpEntity getFormEntity() throws UnsupportedEncodingException {
        return new UrlEncodedFormEntity(params);
    }
}

我在调试器中看到它:没关系。

但是在我的服务器上我得到了这样的东西:

Array
(
    [filter] => {\"gender\":\"w\",\"feature_id\":\"41_7459\"}
    [offset] => 0
    [limit] => 18
)

报价已转义。

我不想替换服务器上的内容。 Java中的replace("\\\"", "\"")不会对字符串产生影响。

2 个答案:

答案 0 :(得分:1)

看起来你正在使用UrlEncodedFormEntity,根据文档是'由url编码对列表组成的实体'([http://developer.android.com/reference/org/apache/http/客户机/实体/ UrlEncodedFormEntity.html])。我从来没有使用过这个,但它听起来不像你想要的那样,因为你是在帖子体内发送数据,而不是通过URL参数。

我之前使用StringEntity类通过post发送json数据,虽然它只编码一个字符串,而不是名称/值对,所以你需要做更多的工作来放置字符串以您希望在服务器上处理的格式:

public class WebParams {
    private ArrayList<NameValuePair> params;
    private String contentType = "application/x-www-form-urlencoded";

    public WebParams() {
        params = new ArrayList<NameValuePair>();
    }

    public void addPair(String name, String value) {
        params.add(new BasicNameValuePair(name, value));
    }

    public String getContentType() {
        return contentType;
    }

    public HttpEntity getFormEntity() throws UnsupportedEncodingException {
        //TODO: Build a string in what ever format you want. 
        //      This will include the gender & feature_id fields as well as the json
        StringBuilder b = new StringBuilder();
        for(NameValuePair nvp : params) {
           builder.append(nvp.getName()).append('=').append(nvp.getValue()).append(',');
        }

        //Now that we have a string to send to the server, get your entity!
        StringEntity entity = new StringEntity(b.toString());
        entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        return entity;
    }
}

答案 1 :(得分:0)

使用简单的引号而不是双引号是否有问题?因为我认为它可以解决你的问题。