从json响应中删除符号

时间:2018-10-31 10:21:08

标签: android json android-volley

我正在使用Volley Library进行JSON解析,同时解析响应如下:

JSON响应:

{"category":{"420":{"key":420,"label":{"420":"Acacia"},"count":"1"},"421":{"key":421,"label":.....

我们可以看到,在响应开始时,会有符号出现。如何在不将其转换为字符串的情况下从Android端删除该符号?由于这个符号,我无法获取JSON对象。

代码:

private void jsonRequestGetFilterData() {
    utils.showDialog();
    String url = Constants.FILTER_URL;
    Log.e("URL", "" + url);

    StringRequest eventoReq = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.e("RESPONSE", response);
                    utils.hideDialog();
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        Log.e("jsonObject",""+jsonObject);

                        JSONObject jsonObjectCategory = jsonObject.getJSONObject("category");
                        Log.e("jsonObjectCategory",""+jsonObjectCategory);



                    } catch (JSONException e) {
                        e.printStackTrace();
                        utils.hideDialog();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Error: ", "" + error.getMessage());
            utils.hideDialog();

        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            // Posting parameters to login url
            Map<String, String> params = new HashMap<String, String>();
            params.put("customer_id", pref.getString(Constants.SP_CUSTOMER_ID, ""));
            params.put("store_id", pref.getString(Constants.SP_STORE_ID, ""));
            params.put("currency_code", pref.getString(Constants.SP_CURRENCY_CODE, ""));

            Log.e("customer_id",""+pref.getString(Constants.SP_CUSTOMER_ID, ""));
            Log.e("store_id",""+pref.getString(Constants.SP_STORE_ID, ""));
            Log.e("currency_code",""+pref.getString(Constants.SP_CURRENCY_CODE, ""));
            return params;
        }
    };
    eventoReq.setRetryPolicy(new DefaultRetryPolicy(
            60000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


    AppController.getInstance(FilterActivity.this).addToRequestQueue(eventoReq);
}

3 个答案:

答案 0 :(得分:5)

您的响应以字节顺序标记(BOM)开头。在读取响应的级别上,您需要确保流或您正在执行的任何操作都知道响应的编码(显然,它不是自动检测到的)。知道正确的编码后,就应该了解并处理BOM。

通常,这是通过服务器响应中的Content-Type标头来处理的,应该在此位置进行修复。但是,如果由于某种原因您无法在此处进行修复,则通常在创建读取流时可以强制执行编码。您看起来像UTF-8。

不要只是使用substring或类似的内容来跳过它。字符串中的其他字符很可能已被错误解释,因为使用了错误的编码。 (这不仅适用于晦涩的字符,英镑符号因编码而异,欧元以及其他任意数量也是如此。)

更多:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

答案 1 :(得分:4)

解决方案1:

字符byte order mark,因此您应该检查编码(UTF-8 with or without BOM)。

解决方案2:

您可以像这样将响应字符串转换为UTF-8

@Override
public void onResponse(String response) {    
    try {
        response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    Log.e("RESPONSE", response);

    ...................
}

答案 2 :(得分:0)

我为我的问题找到了最简单的解决方案。在发送params请求的POST时,请放在代码下面。

此处编码:

 params.put("Content-Type", "application/json; charset=utf-8");

完整代码:

----------
 @Override
            protected Map<String, String> getParams() {
                // Posting parameters to login url
                Map<String, String> params = new HashMap<String, String>();

                params.put("Content-Type", "application/json; charset=utf-8");

                params.put("username", email.getText().toString().trim());
                params.put("password", pwd.getText().toString().trim());
                return params;
            }