org.json.JSONException: Value of type java.lang.String cannot be converted to JSONArray
16lz
2021-01-25
本人在使用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 ,这样我们就可以完成数据的解析了
更多相关文章
- 分支和循环(二)(零基础学习C语言)
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android(安卓)FileInputStream类的使用
- Android(安卓)解决自定义控件布局中match_parent属性无效
- Android开发点滴(13) -- Android数据库随同Android应用一同发布
- java基础学习总结之IO流和equal()方法
- Android: ListView排序及过滤