Удалить символ ï »¿из ответа json - PullRequest
0 голосов
/ 31 октября 2018

Я использую библиотеку залпов для анализа 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 голосов
/ 31 октября 2018

Решение 1:

Символы ï »¿ - это знак порядка байтов , поэтому вы должны проверить кодировку ( UTF-8 с или без спецификации ).

Решение 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);

    ...................
}
0 голосов
/ 20 ноября 2018

Я нахожу самое простое решение для моего вопроса. При отправке 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;
            }
0 голосов
/ 31 октября 2018

Ваш ответ начинается с метки порядка байтов ( BOM ). На уровне, на котором вы читаете ответ, вы должны убедиться, что поток или все, что вы используете для этого, знает кодировку ответа (очевидно, это не автоопределение его). Когда он знает правильную кодировку, он должен понимать и обрабатывать спецификацию.

Обычно это обрабатывается с помощью заголовка Content-Type в ответе от сервера, и именно здесь это должно быть исправлено. Но если по какой-то причине вы не можете исправить это там, обычно при создании потока чтения есть опция для принудительного кодирования. Ваш выглядит как UTF-8.

Не просто используйте substring или аналогичный, чтобы пропустить его. Другие символы в строке вполне могли быть неправильно истолкованы, потому что используется неправильная кодировка. (Это не только для непонятных символов, знак £ меняется в зависимости от кодировки, как и знак € и любое другое число.)

Подробнее: Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!)

...