关于JSON中嵌套了HTML代码导致解析失败的解决办法

背景:

在日常开发过程中,我在调用服务商API的时候,获取到接口返回的JSON数据,可是JSON数据中包含了大量的HTML标签以及CSS样式,其中的双引号会导致JSON解析对象失败……

com.alibaba.fastjson2.JSONException: illegal fieldName inputt, offset 209, character t, line 1, column 210, fastjson-version 2.0.24 {"code":"1","msg":"成功","data":[{"PageCount":"19507","data":[{"RowNum":"1","SHRID":"6760","Title":"可以申请提取公积金的重大疾病种类","AuditDate":"2020-12-01","ReadCount":"20709","BMName":"市公积金中心客户服务科","Content":"<p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">1.恶性肿瘤---不包括部分早期恶性肿瘤</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">2.急性心肌梗塞</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">3.</span><a href="https://www.baidu.com/s?wd=%E8%84%91%E4%B8%AD%E9%A3%8E%E5%90%8E%E9%81%97%E7%97%87&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">脑中风后遗症</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">---永久性的功能障碍</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">4.重大器官移植术或</span><a href="https://www.baidu.com/s?wd=%E9%80%A0%E8%A1%80%E5%B9%B2%E7%BB%86%E8%83%9E%E7%A7%BB%E6%A4%8D%E6%9C%AF&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">造血干细胞移植术</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">---须异体移植手术</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">5.冠状动脉搭桥术(或称冠状动脉旁路移植术)---须</span><a href="https://www.baidu.com/s?wd=%E5%BC%80%E8%83%B8%E6%89%8B%E6%9C%AF&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">开胸手术</span></a></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">6.</span><a href="https://www.baidu.com/s?wd=%E7%BB%88%E6%9C%AB%E6%9C%9F%E8%82%BE%E7%97%85&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">终末期肾病</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">(或称慢性肾功能衰竭尿毒症期)---须透析治疗或肾脏移植手术</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">7.多个肢体缺失---完全性断离</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">8.急性或亚急性重症肝炎</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">9.良性脑肿瘤---须</span><a href="https://www.baidu.com/s?wd=%E5%BC%80%E9%A2%85%E6%89%8B%E6%9C%AF&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">开颅手术</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">或</span><a href="https://www.baidu.com/s?wd=%E6%94%BE%E5%B0%84%E6%B2%BB%E7%96%97&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">放射治疗</span></a></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">10.慢性</span><a href="https://www.baidu.com/s?wd=%E8%82%9D%E5%8A%9F%E8%83%BD%E8%A1%B0%E7%AB%AD&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">肝功能衰竭</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">失代偿期---不包括酗酒或药物滥用所致</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">11.</span><a href="https://www.baidu.com/s?wd=%E8%84%91%E7%82%8E%E5%90%8E%E9%81%97%E7%97%87&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">脑炎后遗症</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">或</span><a href="https://www.baidu.com/s?wd=%E8%84%91%E8%86%9C%E7%82%8E&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">脑膜炎</span></a><span style="font-size:21px;font-family:仿宋_GB2312">后遗症---永久性的功能障碍</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">12.深度昏迷---不包括酗酒或药物滥用所致</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">13.双耳失聪---永久不可逆</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">14.双目失明---永久不可逆</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">15.瘫痪---永久完全</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">16.</span><a href="https://www.baidu.com/s?wd=%E5%BF%83%E8%84%8F%E7%93%A3%E8%86%9C%E6%89%8B%E6%9C%AF&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">心脏瓣膜手术</span></a><span style="font-size: 21px;font-family:仿宋_GB2312">---须</span><a href="https://www.baidu.com/s?wd=%E5%BC%80%E8%83%B8%E6%89%8B%E6%9C%AF&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao" target="_blank"><span style="font-size:21px;font-family:仿宋_GB2312;color:windowtext;text-underline: none">开胸手术</span></a></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">17.严重阿尔茨海默病---自主生活能力完全丧失</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">18.严重脑损伤---永久性的功能障碍</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">19.严重帕金森病---自主生活能力完全丧失</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">20.严重III度烧伤---至少达体表面积的20%</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">21.严重原发性肺动脉高压---有心力衰竭表现</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">22.严重运动神经元病---自主生活能力完全丧失</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">23.语言能力丧失---完全丧失且积极治疗至少12个月</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">24.重型再生障碍性贫血</span></p><p style="text-align:left;text-indent:43px"><span style="font-size:21px;font-family:仿宋_GB2312">25.主动脉手术---须开胸或开腹手术</span></p><p><br/></p>"}]}] }
	at com.alibaba.fastjson2.JSONReaderUTF16.readFieldNameHashCode(JSONReaderUTF16.java:1052)
	at com.alibaba.fastjson2.reader.ORG_5_16_Lore.readObject(Unknown Source)
	at com.alibaba.fastjson2.reader.ORG_4_3_LorePage.readObject(Unknown Source)
	at com.alibaba.fastjson2.reader.ORG_3_3_LoreVO.readObject(Unknown Source)
	at com.alibaba.fastjson2.JSON.parseObject(JSON.java:642)

分析:

通过JSON解析工具,逐行解析,发现问题所在:就是HTML标签中的样式所携带的双引号,导致JSON中的value值提前完结,加上后续字符串的格式不符合JSON格式所致。
在这里插入图片描述

解决:

我们通过定位JSON中的:"来寻找字段的value值起始位置(start),再找出结尾的那个"作为value值的结束位置(end),将此之中不表示结尾的双引号全部替换掉。

在我们的场景中,value值是HTML,所以将其中不表示结束位置end的双引号,全部替换为单引号!

public class JsonUtils {

    public static String escape4Html(String json) {
        // 将字符串转为char数组
        char[] temp = json.toCharArray();
        // 获取到数组的长度
        int n = temp.length;
        // 遍历数组
        for (int i = 0; i < n; i++) {
            // 匹配到JSON中的 :"
            if (temp[i] == ':' && temp[i + 1] == '"') {
                // 继续遍历 :" 之后的数组
                for (int j = i + 2; j < n; j++) {
                    // 匹配到下一个双引号
                    if (temp[j] == '"') {
                        // 如果该双引号的下一个字符不是逗号","和反花括号","
                        if (temp[j + 1] != ',' && temp[j + 1] != '}') {
                            // 就将双引号的替换为单引号"'",使得HTML也能识别
                            temp[j] = '\'';
                        } else if (temp[j + 1] == ',' || temp[j + 1] == '}') {
                            // 反之,结束当前循环,继续处理下一个 :"
                            break;
                        }
                    }
                }
            }
        }
        return new String(temp);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥夜人间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值