JSON解析保证顺序的问题(部分想法)
前提
碰到这样一个问题,在数据库中一个字段中的内容是一段字符串的json数据,包括一系列的key:value值,无嵌套和其它要求,例如 “{key1:value1,key2:value2,key3:value3}”,从数据库中取出来,在前端以key 和value用表格显示。如下图
名称 | 值 |
---|---|
key1 | value1 |
key2 | value2 |
key3 | value3 |
思路
取出数据库中的字符串通过前端的JSON.parse(str)遍历显示key,value值。到此一个新的要求是要显示的顺序和数据库中保持一致,通过JSON.parse()通常会按照key排序。所以使用JSON.parse失败。
只能手动获取字符串中的key,value值,最好的方式是采用正则,不然也可以采用 replace,replaceALl,split等方法逐步分割
//去掉左右{}括号
str= str.replace("{","");
str = str.replace("}","");
//按照双引号分割数组,在遍历数组筛选key,value值
const arr = str.scriptParam.split("\"");
//p 不按照":"分割是因为value值中也可能有特殊符号":"
在回到如果不需要保持顺序的情况下,使用JSON.parse()遇到了抛出异常的问题,一看数据库中的内容,发现并不是标准的JSON格式,比如这段{name:“张三”,age:12},此时使用JSON.parse便会抛出异常,所以需要改为{“name”:“张三”,age:12} 解决的思路是前端给该字符串补全双引号,不过也可以用JAVA。
思路是通过fastjson库将字符串转换为JSON对象,在转回JSON字符串。这里利用了fastjson对JSON格式要求不严格
在使用fastjson直接将字符串转为JSON对象后在转换回JSON字符串,顺序将保证不了。修改代码
JSONObject jsonObject = JSONObject.parseObject(str, Feature.OrderedField);
str = JSONObject.toJSONString(jsonObject);
这里仅仅对key,value形式,key不带双引号的,value仅仅是字符串(也仅带特殊符号":")的处理,对于嵌套的JSON格式或者value值为时间,数字,其它转义特殊符号还考虑。还有些地方需要完善。
其它
jdk 8;fastjson fastjson-1.2.58 ;
fastjson与jackson解析key没有引号的json