不管是用HttpClient还是用OkHttp,都可以用来请求网络,然后拿到后台返回的json数据,然后按需要一步步解析。

当然,我们有时候需要先确认返回的json数据中某个字段有没有数据,我们拿到json字符串,然后用工具把它格式化,就可以人性化地看json数据。

json数据中的数字和字母一般都不会因为编码发生变化,但是汉字就比较特殊,会在GBK、UTF-8中有不同的表现形式。

之前我用的是AsyncHttp(一个古老的用HttpClient封装的网络请求框架),返回的数据是一个回调接口,接口中有个参数:JSONObject response,然后就可以一层层拿到response中需要的数据。

也可以把response的全部数据以字符串形式拿出来,放在json格式化工具中展示。

后来我在使用Retrofit时,拿到的回调数据是:Response response,然后使用response.body().string()拿到后台返回的json数据,可是当我拿到格式化工具中查看时,我傻眼了,里边没有一个汉字,全部是Unicode编码,不是乱码,不是乱码,不是乱码。

我在想是不是Retrofit处理了我的返回数据,又用Okhttp试了下,还是那样,难道后台返回的数据是Unicode,经确认,后台返回的数据是UTF-8格式的,这就奇怪了,为什么AsyncHttp拿到的是UTF-8的,难道Okhttp对数据做了手脚?

简单地看了下,没找到OkHttp有修改编码的地方,那就只能想办法修改数据编码格式了。

方法一:

在网上搜了下,有方法可以将UTF-8 转换成 Unicode,http://blog.csdn.net/xyw_blog/article/details/8510740,不过看起来好长。

utf-8转unicode
/*** utf-8 转换成 unicode* @author fanhui* 2007-3-15* @param inStr* @return*/public static String utf8ToUnicode(String inStr) {char[] myBuffer = inStr.toCharArray();StringBuffer sb = new StringBuffer();for (int i = 0; i < inStr.length(); i++) {UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]);if(ub == UnicodeBlock.BASIC_LATIN){//英文及数字等sb.append(myBuffer[i]);}else if(ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){//全角半角字符int j = (int) myBuffer[i] - 65248;sb.append((char)j);}else{//汉字short s = (short) myBuffer[i];String hexS = Integer.toHexString(s);String unicode = "u"+hexS;sb.append(unicode.toLowerCase());}}return sb.toString();}/*** unicode 转换成 utf-8* @author fanhui* 2007-3-15* @param theString* @return*/public static String unicodeToUtf8(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 xxxxint 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);}} elseoutBuffer.append(aChar);}return outBuffer.toString();}

方法二:

然后又去找其他方法,之前用过Retrofit和Gson的配合,然后gradle中导入Gson和Retrofit的Gson转换包,这一次拿到response.body().string()的数据后,放进格式化工具中一看,汉字出来了。

有点小激动,看来Gson默认是UTF-8格式,成功了,但是又一想,为了这个目的,连导了两个包,这不划算呀。

方法三:

继续思考,受Gson和AsyncHttp中JsonObject的启发,我尝试创建了一个对象,

JsonObject jsonObject = new JsonObject(response.body().string());

然后调用

jsonObject.toString();

把得到的数据放入格式化工具中,汉字出现了。

总结

这样比较下来,方法三还是比较简单方便的。

go json数据出现unicode_【Android】OkHttp、Retrofit拿到的json是Unicode,我要的是UTF-8呀...相关推荐

  1. android网络请求撤销,Android OkHttp + Retrofit 取消请求的方法

    前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何找到这一个 ...

  2. 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析

    全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析 废话先说一点,算了.直接进入正题吧. 用例子说话: JSON数据: string json: " {" ...

  3. Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

    今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...

  4. android给后台传递json,将服务中的JSON数据发送到Android中的UI

    要求是:我有一个后台服务,在该服务中,我正在执行REST调用以获取JSON数据.我想将JSON数据发送到UI并更新内容. 我可以使用的一种方法是,将整个JSON字符串存储在SharedPreferen ...

  5. controller接收json数据_答疑 | 前后端分离,如何接收json数据?

    1.颜老师,在前后端分离的项目中,后端如何接收前端发来的json数据?我记得是@RequestBody,但有时候会报错. 答:当使用SpringMVC接收json数据时,需要区分json的数据格式,具 ...

  6. python为什么closed_为什么Python无法解析此JSON数据? [关闭] - Why can't Python parse this JSON data? [closed]...

    问题: I have this JSON in a file: 我在文件中有此JSON: { "maps": [ { "id": "blabla&qu ...

  7. ios 获取html中的json数据,[IOS]UIWebView实现保存页面和读取服务器端json数据

    #import"ViewController.h" @interfaceViewController() @end @implementation ViewController - ...

  8. python爬取json数据与实际不一样_Python如何爬取Json数据

    Python如何爬取Json数据 发布时间:2020-12-08 09:52:09 来源:亿速云 阅读:58 作者:小新 这篇文章将为大家详细讲解有关Python如何爬取Json数据,小编觉得挺实用的 ...

  9. javaweb后台如何传json数据给前台,以及前台如何解析得到json中数据

    后台controoler中传数据给前台jsp方法: 1.后台controller的方法中定义一个JsonObject对象,JsonObject jsonObject=new JsonObject(); ...

最新文章

  1. 什么叫计算机网络阻塞,计算机网络体系结构的阻塞控制是什么呢?
  2. 鸡啄米:模态、非模态对话框
  3. 《数字图像处理》冈萨雷斯学习笔记3:频域处理
  4. 心想技术驱动业务,却在背道而驰
  5. codeUp 2031 To fill or not to fill 复杂贪心
  6. Android Studio 导入 AOSP 源码 1
  7. 软件开发安全性_开发具有有效安全性的软件的最佳方法
  8. BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程
  9. 没有文化可以学php吗,宋威龙深夜发文感慨,却被吐槽文化低,学历真的重要吗?...
  10. c++ inline 函数及变量
  11. 关于CSS的fixed定位
  12. python一个类有几个实例对象_Python用一个类实例来解开一个对象
  13. html中的form是空标签么,关于html 中form表单的内标签和使用
  14. link st 量产工具_STM32 ST-LINK Utility介绍、下载、安装、使用方法
  15. Python 的切片为什么不会索引越界?
  16. 纯css3黑洞动画js特效
  17. python爬虫和八爪鱼哪个快_八爪鱼采集器能取代python爬虫吗?
  18. linux vi波浪符号的作用,vi使用方法
  19. 【云原生之Docker实战】使用Docker部署Wizard文档管理系统
  20. 计算机缓存怎样更改,计算机的缓存大小在哪设置?

热门文章

  1. xaml 的 intellisense失效的解决办法
  2. 小老弟,来爬取携程的民宿酒店数据啦(附带源码)
  3. Python学习笔记——输入与输出用法
  4. linux rkt命令,rkt 1.13.0发布,CoreOS的容器引擎
  5. STM32L0 读取芯片温度与当前供电电压 STM32L051C8T6
  6. 对于超平面的理解[转载]
  7. Mysql 如何通过binlog日志恢复数据
  8. linux动态库加载RPATH,RUNPATH
  9. tmpwatch命令
  10. Unity3d查找游戏对象