失去灯火之后不必慌乱,你还可以看见满天的繁星
异常描述
最近在进行JSON转换时,本来之前好好的,不知道怎么就突然转换不了了,
控制台报错如下:
在Debug的时候发现了是JSON对象中含有转义字符("\")导致转换失败,如以下格式的JSON对象:
{
"name": "小红帽\大灰狼",
"age": 17
}
百度了一下,发现大家都说升级fastjson的版本,可是各种换版本都无效,
那怎么解决呢?请看下一章节
解决方案
格式校验
其实JSON转换出现问题,无非是JSON格式出现了问题
我们可以去SO JSON在线网去校验一下:https://www.sojson.com/
果然校验不通过,更改一下:
编码解码
但是我这次呢,其实接收的数据是没有毛病的。
主要是上一期博客:JSON解析实战篇:JSON数组中含JSON数组中处理接收的JSON数据,然后根据要求进行JSON字符串的拼接,再将拼接的JSON字符串转换时出问题了。
代码模拟如下:
/**
* @author guqueyue
* @Date 2020/4/5
* 异常模拟
**/
public class Test3 {
public static void main(String[] args) {
// 模拟接收的数据
String str = "{'name':'小红帽\\\\大灰狼', 'age':17}";
// 成功转换。老铁,没毛病
Person person = JSON.parseObject(str, Person.class);
// 取出name所对应的属性值
String name = person.getName();
// 拼接成新的json字符串
String jsonString = "{'role':'"+name+"', 'skill':'eat'}";
// 成功报错
Man man = JSON.parseObject(jsonString, Man.class);
}
}
Output:
苦思冥想,终于想到个先编码再解码的办法:
/**
* @author guqueyue
* @Date 2020/4/5
* 异常模拟
**/
public class Test3 {
public static void main(String[] args) throws Exception {
// 模拟接收的数据
String str = "{'name':'小红帽\\\\大灰狼', 'age':17}";
// 成功转换。老铁,没毛病
Person person = JSON.parseObject(str, Person.class);
// 取出name所对应的属性值
String name = person.getName();
// 将name进行编码
name = URLEncoder.encode(name, "Unicode");
// 拼接成新的json字符串
String jsonString = "{'role':'"+name+"', 'skill':'eat'}";
// 成功生成对象
Man man = JSON.parseObject(jsonString, Man.class);
System.out.println("解码前:" + man);
// 解码
man.setRole(URLDecoder.decode(man.getRole(), "Unicode"));
System.out.println("解码后:" + man);
}
}
大功告成:
面向对象
其实上一个编码解码的解决方案有些过于面向过程了,看起来似乎还挺方便,但是如果遇到比较复杂的情况可能就有些不够看了。
这一次我们运用面向对象的思想,建立起对象之间的映射关系,用构造方法进行对象间的转换,如图中代码所示:
/**
* @author guqueyue
* @Date 2020/4/7
**/
@Data // lombok插件的注解,若是没有用lombok插件,请自行生成getter、setter方法
public class Man {
private String role; //角色
private String skill; //技能
public Man() {
}
public Man(JSONObject jsonObject, String skill) {
// 将JSON对象转换成Java对象
Person person = JSON.toJavaObject(jsonObject, Person.class);
// 转换
this.role = person.getName();
this.skill = skill;
}
}
Main方法:
/**
* @author guqueyue
* @Date 2020/4/7
* 异常模拟
**/
public class Test3 {
public static void main(String[] args) {
// 模拟接收的数据
String str = "{'name':'小红帽\\\\大灰狼', 'age':17}";
//转换成JSON对象
JSONObject jsonObject = JSON.parseObject(str);
String skill = "eat";
//转换
Man man = new Man(jsonObject, skill);
// 打印到控制台输出
System.out.println(man);
}
}
perfect,Output: