作为移动端开发者,和服务器的通信是少不了了。下面我总结一我在开发中遇到有关json的问题
在我刚入门的时候,在公司的写代码当时的网络返回也不复杂,10个字段以内,基本上熟悉Json的固定格式,手动写Bean接收数据,只要用心字段名称和类型对应就不会出问题。 推荐的Json格式校验网站,http://json.parser.online.fr/
问题:就是如果字段复杂,就要花很多时间去校对字段,确认字段对象类型。
其实校验Json格式这种没什么技术含量的事情,应该交给计算机去做。 所以网上有很多解决办法
网站在这里: http://www.bejson.com/json2javapojo/
这是个一个能够直接在Android Studio运行的插件。输入Json字符串能够直接生成bean对象
安装 安装如下图: 选择 Plugins->搜索GsonFormat使用 快捷键 Alt+Instert 弹出 复制Json字符串进去就OK了。
最近在写个项目,接口来自其他公司网络返回,有一个巨坑的问题, 不定格式的Json内容。
有时是avatar:{"对象类型"}
有时是avatar:"String类型"其实就一个关键的url头像地址最重要。如果是对象类型,对象中就包含一些图片信息和url地址,如果是String类型就直接是一个url图片地址。 直接使用定义为对象的话就会出现异常 异常信息:参数异常,需要的解析的Bean该字段对应的是Object对象,但Json字符串中对应的是String对象。com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 14210 path $.pin.repins[1].user.avatar
非常非常的坑爹!!
正则表达式 在网络数据还没解析成Bean对象之前,处理成字符串,用正则对该字符串进行处理。
正则表达式,在网络返回后将二进制流时转换成字符串,正则表达式匹配查找取出其中url关键数据,替换统一成avatar:"String类型"
下面贴一部分实现代码
说明:我的网络访问使用的是Retrofit,是Jack大神开发的REST风格的网络访问框架。以下代码关键是在retrofit.Converter.Factory上得到二进制网络返回体上做修改,其他网络框架也可以,只要能到网络访问体即可。
网络字节流转字符串
@Override public T convert(ResponseBody value) throws IOException { Reader reader = value.charStream();//取出字节流 String result; try { BufferedReader in = new BufferedReader(reader);//读取 StringBuffer buffer = new StringBuffer();//构造buffer对象用于拼接 String line; while ((line = in.readLine()) != null) {//读行 buffer.append(line);//写入buffer } result = buffer.toString(); } finally { Utils.closeQuietly(reader);//记得关闭流 } return gson.fromJson(regexChange(result), type);//返回解析后的对象 }正则表达式在Java的应用
/** * 对输入的字符串进行处理 * @param input 传入的需要处理的字符串 * @return */ private String regexChange(String input) { String result=input; //匹配规则是当avatar是{}包装的对象 Pattern mPAvatar=Pattern.compile("\"avatar\":\\{([^\\}]*)\\}"); Matcher mMAvatar=mPAvatar.matcher(result); while (mMAvatar.find()){//如果找到 开始替换 result=result.replaceFirst("\"avatar\":\\{([^\\}]*)\\}",getKey(mMAvatar.group())); } return result; } /** * 取出关键值返回 * @param group * @return */ private String getKey(String group) { Matcher matcher=mPkey.matcher(group); StringBuffer buffer=new StringBuffer(); buffer.append("\"avatar\":\"http:///"); while (matcher.find()){ buffer.append(matcher.group(1)); } buffer.append("\""); return buffer.toString(); }完美解决~~
这在是一篇博客看到的,也是在Retrofit上应对不定格式的Json格式解析,思路也是在也是Converter.Factory的convert方法上做处理。思路是定义两个不同的Bean类型,捕捉异常,做二次解析。不符合我的项目使用,只做介绍。 具体实现看博客:http://blog.csdn.net/efan006/article/details/50544204