从 json 响应中删除符号 
Remove symbol  from json response
我正在使用 Volley 库进行 JSON 解析,解析时返回的响应如下:
JSON 回复:
{"category":{"420":{"key":420,"label":{"420":"Acacia"},"count":"1"},"421":{"key":421,"label":.....
我们可以看到,在响应开始时出现了一个符号  。如何从 Android 端删除此符号而不将其转换为字符串?由于这个符号,我无法获得 JSON Object.
代码:
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);
}
您的回复以 byte-order 标记 (BOM) 开头。在您阅读响应的级别,您需要确保流或您正在使用的任何东西知道响应的编码(显然不是 auto-detecting )。当它知道正确的编码时,它应该理解并处理 BOM。
通常,这是通过服务器响应中的 Content-Type
header 处理的,这是应该修复的地方。但是如果由于某种原因你不能在那里修复它,通常在创建读取流时会有一个选项来强制编码。你的看起来像 UTF-8。
不要只使用substring
或类似的跳过它。字符串中的其他字符很可能被错误地解释,因为使用了错误的编码。 (这不仅适用于晦涩难懂的字符,£ 符号因编码而异,€ 和任何其他字符也是如此。)
解决方案一:
字符是byte order mark , so you should check your encoding (UTF-8 with or without BOM).
方案二:
您可以将响应字符串转换为 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);
...................
}
我为我的问题找到了一个最简单的解决方案。当您为 POST
请求发送 params
时,将代码行放在下面。
代码在这里:
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;
}
我正在使用 Volley 库进行 JSON 解析,解析时返回的响应如下:
JSON 回复:
{"category":{"420":{"key":420,"label":{"420":"Acacia"},"count":"1"},"421":{"key":421,"label":.....
我们可以看到,在响应开始时出现了一个符号  。如何从 Android 端删除此符号而不将其转换为字符串?由于这个符号,我无法获得 JSON Object.
代码:
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);
}
您的回复以 byte-order 标记 (BOM) 开头。在您阅读响应的级别,您需要确保流或您正在使用的任何东西知道响应的编码(显然不是 auto-detecting )。当它知道正确的编码时,它应该理解并处理 BOM。
通常,这是通过服务器响应中的 Content-Type
header 处理的,这是应该修复的地方。但是如果由于某种原因你不能在那里修复它,通常在创建读取流时会有一个选项来强制编码。你的看起来像 UTF-8。
不要只使用substring
或类似的跳过它。字符串中的其他字符很可能被错误地解释,因为使用了错误的编码。 (这不仅适用于晦涩难懂的字符,£ 符号因编码而异,€ 和任何其他字符也是如此。)
解决方案一:
字符是byte order mark , so you should check your encoding (UTF-8 with or without BOM).
方案二:
您可以将响应字符串转换为 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);
...................
}
我为我的问题找到了一个最简单的解决方案。当您为 POST
请求发送 params
时,将代码行放在下面。
代码在这里:
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;
}