我从外部进程获得了一些我无法更改的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\"}");
当我运行这个时,我得到一个模糊的运行时错误:
非法重复
任何正则表达的大师都可以找到我要去的地方吗?提前谢谢。
答案 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