2013-02-15 2 views
0

Мне предоставлен некоторый JSON из внешнего процесса, который я не могу изменить, и мне нужно изменить эту строку JSON для работы процесса downstream Java. Строка JSON выглядит следующим образом:Использование regex для удаления котировок 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\"}"); 

Когда я запускаю это я получаю смутную ошибку во время выполнения:

Illegal repetition

Может какое-нибудь место регулярного выражения, где я собираюсь сбежать? Заранее спасибо.

+1

'{" widgets ": blah," is_dog ":" 1 "}' недействителен JSON, что вы используете для десериализации? –

+0

Конечно, вы всегда можете разобрать JSON, проанализировать встроенный объект, затем собрать и повторно выполнить сеанс. –

+0

@BenjaminGruenbaum - Вы должны прочитать немного внимательно - «blah» действительно '{" someJson ":" object "}'. –

ответ

1

Я считаю, что вам нужно избежать брекетов. Скобки используются для повторения ((foo){3} три раза подряд ищет foo); следовательно, ошибка.

Примечание: в данном случае это должно быть двойное экранирование: \\{.

+0

Спасибо, что на самом деле ** отвечу на мой вопрос ** вместо того, чтобы сделать вывод, что * вы думаете, что я действительно должен делать, * видя, что никто здесь не понимает все детали ниши моей ситуации, и на этом вы презираете за то, что слишком много предыстория. – 2013-02-15 12:46:04

+0

Я думаю, что иногда предлагая, что люди * должны делать, это достойный ответ. В противном случае все будут анализировать HTML с регулярными выражениями (нерегулярно) –

+0

@TicketMonster, многие вопросы на этом сайте связаны с регулярными выражениями, используемыми для синтаксического анализа вещей, когда другой способ будет работать лучше. Я считаю справедливым предлагать другие подходы к вашей проблеме. Однако иногда люди заходят слишком далеко, говоря, что регулярные выражения всегда «неправильны» для определенных типов данных. Это не правда; это зависит от того, что вы делаете. – 2013-02-15 12:56:26

1

{ и } in regex есть особый смысл. Они должны упомянуть допустимое повторение паттернов. Таким образом, их нужно сбежать.

Использовать \\{\"widgets\":\"", "\\{\"widgets\": вместо {\"widgets\":\"", "{\"widgets\":.

1

Я действительно задаюсь вопросом, лучше ли вы использовать код для JSONObject и модифицировать метод toString(), чтобы сделать это более надежным преобразованием, чем с использованием регулярных выражений. Here's the source code, и вы ищете вызовы метода quote()

0

Хорошо, почему бы вам просто не сделать следующее?

1) Декодирование первого JSON (который является правильным в кавычках) в varJSON1

2) Получить строку "Л" в varJSON1 в varJSON2

3) Затем декодировать varJSON2

1

Так как входная строка выглядит корректной json, лучшим вариантом будет ее синтаксический анализ с фактическим синтаксическим анализатором для структуры, подобной карте. Регулы не являются подходящими инструментами для этого. Сериализация этой структуры для чего-то не совсем json была бы относительно простой.

Смежные вопросы