2012-02-07 18 views
1

У меня есть строка, которая является «почти» json-строкой, только ее ключи не окружены кавычками. Обычно он используется пользовательским интерфейсом и javascript, который не имеет проблемы при его интерпретации. Однако, похоже, JSON-синтаксические анализаторы на Java, которые я знаю, требуют, чтобы ключ был окружен кавычками.Формат Non Json для формата JSON

Есть ли способ, которым я могу преобразовать строку в действительную строку json, возможно, используя регулярное выражение в Java. Или есть JSON lib, который немного снисходителен.

Строка будет иметь вид

{ 
    A : "Val1", 
    B : [ SOME NESTED STUFF], 
    C : "Val3" 
} 

и мне нужно, чтобы преобразовать его в

{ 
    "A" : "Val1", 
    "B" : [ SOME NESTED STUFF], 
    "C" : "Val3" 
} 

без воздействия вложенного материала. Количество ключей, то есть A, B, C, фиксировано.

P.S. Я не могу получить соответствующую строку JSON, возвращенную мне, это уже существующий код, и довольно рискованно изменить его.

+0

Гарантируют ли Val1 и Val3 двойные кавычки? –

+1

Какой парсер вы используете? – pingw33n

+1

'([^"] \\ w + [^ "]?):' ... это просто у меня на голове, но должен указывать вам в правильном направлении. Идея состоит в том, чтобы работать от двоеточия, так как вы знаете, что ищете один или несколько символов слова, которые не цитируются перед двоеточием. –

ответ

0

с помощью следующей строки кода, чтобы приложить все ключи (один колпачков письмо считается действительным ключом здесь) двойные кавычки:

str = str.replaceAll("\s([A-Z])\s\:\s\"", "\"$1\" : "); 
+1

Перерывы на '{A:" B: C "}'. – cHao

+0

, если вы так обновляете, что будет работать s.replaceAll ("\\ s ([AZ]) \\ s + ([\\: \"]) "," \ "$ 1 \" $ 2 ") – HRgiger

+0

Я wasn ' Даже если они фиксированы, выражение все равно испортит вторую строку, содержащую «(некоторая буква)». – cHao

0

Если вы действительно хотите, регулярное выражение, это может работать:

jsonString.replaceAll("(\\w+)\\s*\\:","\"$1\" :"); 

Тем не менее, если вы действительно приста чтобы прикоснуться к вложенным материалам и угловым делам, вам нужен настоящий парсер, а не регулярное выражение. Нет никакого способа, чтобы регулярное выражение было достаточно точным, чтобы избежать помех, если одно из ваших значений - строка " A : ". Если pingw33n правильно относится к парсеру Jackson, это, безусловно, лучший ответ.

1

Если вы уверены, что все строки, начинающиеся с     unquoted_word : нужно слово в кавычки, вы могли бы использовать что-то вроде:

str.replaceAll("(?m)^(\s+)(\w+)(\s*:)", "$1\"$2\"$3"); 


Но если вы можете, вероятно, лучше с помощью правильный парсер, как и другие ответы.

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