原创

缺少双引号的字符串转换成Json对象

本人所写方式比较啰嗦(能完美达到效果),正则不会:

jsonStr = jsonStr.replaceAll("\\{","{\"")
.replaceAll(":","\":\"")
.replaceAll("}","\"}")
.replaceAll(",","\",\"")
.replaceAll("}\",\"\\{","},{")
.replaceAll("\"\\[","[")
.replaceAll("]\"","]");


至于下面的转载网上的, 我没成功过, 想要研究的可以自己看看下面看看行不行

第一种情况

解密之后的字符串是下面这个样子的:

String jsonStr = "{appkey:zkkOpNJ1Jo,adtype:1,appid:33e496d5fec,deviceid:15d994b}";
  • 1

直接JSONObject jsonObject = JSONObject.fromObject(jsonStr)就会报错。如果截取字段,又觉得麻烦,于是就采用了替换的方式,代码如下:

jsonStr = jsonStr.replace("{", "{\"");
jsonStr = jsonStr.replace(":", "\":\"");
jsonStr = jsonStr.replace(",", "\",\"");
jsonStr = jsonStr.replace("}", "\"}");
  • 1
  • 2
  • 3
  • 4

这样就可以给各个每处节点都加上了引号,然后再转换成Json

JSONObject jsonObject = JSONObject.fromObject(jsonStr);
System.out.println("转换后:"+jsonObject);
  • 1
  • 2

这里写图片描述

第二种情况

当我以为已经搞定的时候,又出现了新的情况,在另一个接口中解密出的字符串如下:

String jsonStr = "{mac:98:3b:16:fe:44:70,men:1761MB,storage:3921.16MB,deviceid:15d994b1}";
  • 1

由于mac中的值中包含有“:”,所以拿第一种方法来解决处理的时候果断报错。想了一会,没有好的想法,就用了笨方法,截取!先以逗号分隔成数组,然后再分别截取数组中第一个分号前后的内容,并用StringBuffer拼接。代码如下:

String jsonStr = "{mac:98:3b:16:fe:44:70,men:1761MB,storage:3921.16MB,deviceid:15d994b1}";
System.out.println("转换前:" + jsonStr);
jsonStr = jsonStr.substring(1, jsonStr.length() - 1);
String[] strs = jsonStr.split(",");
StringBuffer stringBuffer = new StringBuffer("{");
for (int i = 0; i < strs.length; i++) {
    stringBuffer.append("\""
          + strs[i].substring(0, strs[i].indexOf(":")) + "\":\""
          + strs[i].substring(strs[i].indexOf(":") + 1) + "\",");
    System.out.println(strs[i].substring(0, strs[i].indexOf(":"))
        + " = " + strs[i].substring(strs[i].indexOf(":") + 1));
            }
stringBuffer.replace(stringBuffer.length() - 1,stringBuffer.length(), "}");

JSONObject jsonObject = JSONObject.fromObject(stringBuffer.toString());
System.out.println("转换后:" + jsonObject);

这里写图片描述

**

补充

** 
学习使用Java 1.8以后,下面的代码也可以搞定了,如下:

String result = Arrays.stream(jsonStr.substring(1, jsonStr.length() - 1).split(","))
                .map(v -> "\"" + v.replaceFirst(":", "\":\"") + "\"")
                .reduce("{", (a, b) -> a + b + ",")
                .toString();
result = result.substring(0, result.length() - 1) + "}";
JSONObject js = JSONObject.fromObject(result);

虽然方法笨一点,但是也达到了效果。 
贴出来分享一下,大牛们有没有更好的实现方法呢?欢迎批评指正。

test.replaceAll("(\\{|,)([^:]+)", "$1\"$2\"").replaceAll("([^:,\\}]+)(\\}|,)", "\"$1\"$2") 可以用正则替换的方式进行,支持内部嵌套 

 return json.replaceAll("\":\\s*([^\\[{\"])(.*?)(?=[[,\"]|[},]}])", "\":\"$1$2\"");

参考链接: https://blog.csdn.net/a_bang/article/details/51847810  

正文到此结束
Loading...