本人在使用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 ,这样我们就可以完成数据的解析了

更多相关文章

  1. 分支和循环(二)(零基础学习C语言)
  2. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  3. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  4. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  5. Android(安卓)FileInputStream类的使用
  6. Android(安卓)解决自定义控件布局中match_parent属性无效
  7. Android开发点滴(13) -- Android数据库随同Android应用一同发布
  8. java基础学习总结之IO流和equal()方法
  9. Android: ListView排序及过滤

随机推荐

  1. 函数与数据类型详解
  2. Arch Linux 安装 Anbox
  3. 配置香港高防虚拟主机必备要点
  4. 模板字面量和闭包函数
  5. laravel_day4
  6. JavaScript表单元素获取及dom元素的操作
  7. javascript数组常用得api与表单事件实例
  8. Js 运行机制与字符串,数组常用 API
  9. MyCms 开源自媒体系统,系统配置字段说明
  10. 人物肩部怎么画?漫画头颈肩的画法