Fastjson异常解决->com.alibaba.fastjson.JSONException: unclosed single-quote string

失去灯火之后不必慌乱,你还可以看见满天的繁星

异常描述

最近在进行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:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 166 · 访问量 8910

猜你喜欢

转载自blog.csdn.net/Qizhi_Hu/article/details/105329392