0

我从无法更改的外部进程获得了一些 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\"}");

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

非法重复

任何正则表达式大师都可以发现我会出错的地方吗?提前致谢。

4

5 回答 5

1

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

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

于 2013-02-15T12:41:50.403 回答
1

{并且}在正则表达式中具有特殊含义。他们要提到允许的模式重复。所以他们要逃到这里。

使用\\{\"widgets\":\"", "\\{\"widgets\":而不是{\"widgets\":\"", "{\"widgets\":.

于 2013-02-15T12:42:25.613 回答
1

我确实想知道您是否最好使用JSONObject的代码并修改toString()方法以使其成为比使用正则表达式更可靠的转换。这是源代码,您正在寻找方法的quote()调用

于 2013-02-15T12:43:37.580 回答
1

Since the input string looks to be valid json, your best bet would be to parse it with an actual parser to a map-like structure. Regexes are not the right tools for this. Serializing this structure to to something not quite json would then be relatively simple.

于 2013-02-15T12:45:56.677 回答
0

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

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

2)将字符串“blah” varJSON1放入varJSON2

3)然后解码varJSON2

于 2013-02-15T12:44:29.893 回答