使用正则表达式删除JSON引号

时间:2013-02-15 12:39:38

标签: java regex

我从外部进程获得了一些我无法更改的JSON,我需要修改此JSON字符串以使下游Java进程工作。 JSON字符串如下所示:

{"widgets":"blah","is_dog":"1"}

但它需要看起来像:

{"widgets":blah,"is_dog":"1"}

我必须删除blah周围的引号。实际上,blah是一个巨大的JSON对象,所以我为了这个问题简化了它。所以我想我会通过两次String#replace次呼叫来解决问题,一次在blah之前,一次在之后:

dataString = dataString.replaceAll("{\"widgets\":\"", "{\"widgets\":");
dataString = dataString.replaceAll("\",\"is_dog\":\"1\"}", ",\"is_dog\":\"1\"}");

当我运行这个时,我得到一个模糊的运行时错误:

  

非法重复

任何正则表达的大师都可以找到我要去的地方吗?提前谢谢。

5 个答案:

答案 0 :(得分:1)

我相信你需要逃避牙箍。大括号用于重复((foo){3}连续三次查找foo);因此错误。

注意:在这种情况下,它需要双重转义:\\{

答案 1 :(得分:1)

正则表达式中的

{}具有特殊含义。他们提到允许重复模式。所以他们要逃到这里。

使用\\{\"widgets\":\"", "\\{\"widgets\":代替{\"widgets\":\"", "{\"widgets\":

答案 2 :(得分:1)

我想知道你是否最好不要使用JSONObject的代码并修改toString()方法,使其比使用regexp更可靠。 Here's the source code,您正在寻找quote()方法

的调用

答案 3 :(得分:1)

由于输入字符串看起来是有效的json,最好的办法是用实际的解析器将其解析为类似地图的结构。正则表达式不是正确的工具。将这个结构序列化为不完全json的东西会相对简单。

答案 4 :(得分:0)

那么,为什么不简单地执行以下操作?

1)将第一个JSON(引号正确)解码为varJSON1

2)将varJSON1中的字符串“blah”导入varJSON2

3)然后解码varJSON2