本人在使用http请求数据返回json中string字段包含unicode的转码时遇到的问题总结:
首先来一个unicode的转码工具类:
public class Testa {
public static String decodeUnicode(String theString) {
char aChar;
int len = theString.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;) {
aChar = theString.charAt(x++);
if (aChar == '\\') {
aChar = theString.charAt(x++);
if (aChar == 'u') {
// Read the xxxx
int value = 0;
for (int i = 0; i < 4; i++) {
aChar = theString.charAt(x++);
switch (aChar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
value = (value << 4) + aChar - '0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
outBuffer.append((char) value);
} else {
if (aChar == 't')
aChar = '\t';
else if (aChar == 'r')
aChar = '\r';
else if (aChar == 'n')
aChar = '\n';
else if (aChar == 'f')
aChar = '\f';
outBuffer.append(aChar);
}
} else
outBuffer.append(aChar);
}
return outBuffer.toString();
}
}
看一下我使用postMan调试的返回数据
这里可以看到title里面的字符都为unicode 这里我们调用我们的工具类就可以将转码为utf-8
转码完成后,调用**JSONArray arr = new JSONArray(s);**报错org.json.JSONException: Value of type java.lang.String cannot be converted to JSONArray
这里提示我们不能将String类型的转换为数组
造成问题的原因是在编写json文件的时候,采用utf-8编码,utf8有个BOM格式(json串头部发现字符:”\ufeff” )。去掉这个格式就ok了。
解决方法:
public static String JSONTokener(String str_json) {
// consume an optional byte order mark (BOM) if it exists
if (str_json != null && str_json.startsWith("\ufeff")) {
str_json= str_json.substring(1);
}
return str_json;
}
这样就可以完美将数据解析成功了
下面来看完整代码:
@Override
protected void initData() {
// webView = getView().findViewById(R.id.webView);
//
// webView.loadUrl("https://www.baidu.com/");
new Thread(new Runnable() {
@Override
public void run() {
try {
testBaidu();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public void testBaidu() throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("xxxxxxxxxxxxxx")
.addHeader("Content-Typ", "application/json;charset=UTF-8")
.build();
Response response = client.newCall(request).execute();
String backMessage = response.body().string();
//Unicode转utf-8
String s = Testa.decodeUnicode(backMessage).trim();
try {
JSONArray arr = new JSONArray(JSONTokener(s));
Gson gson = new Gson();
for (int i = 0; i < arr.length(); i++) {
//这里的TestBean 就是我们返回数据对应的实体类
TestBean userBean = gson.fromJson(arr.get(i).toString(), TestBean.class);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public static String JSONTokener(String str_json) {
// consume an optional byte order mark (BOM) if it exists
if (str_json != null && str_json.startsWith("\ufeff")) {
str_json = str_json.substring(1);
}
return str_json;
}
ok ,这样我们就可以完成数据的解析了