2014-02-09 3 views
1

Я пытаюсь заменить все " на \" и проанализировать строку с помощью JSON, но браузер выдает ошибку SyntaxError: JSON Parse error: Unrecognized token '\'.Замена «с помощью»

Ниже приведен код. Строка a является JSON.параметром хорошо, но хотя я заменяю все " на \" в строке b, так что он должен быть идентичным строке a, синтаксический анализ не выполняется. У меня есть код в JSBIN.

var a = '[\"{\\"objects\\":[],\\"background\\":\\"#fff\\"}\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]'; 

var b = '["{\"objects\":[],\"background\":\"#fff\"}","","","","","","","","",""]'; 

// Replace " with \" 
// Charcode 92 is \ 
b = b.replace('"', String.fromCharCode(92)+'"', "g"); 

a = JSON.parse(a); 
console.log(a); 
b = JSON.parse(b); 
console.log(b); 

Любая идея, как я мог бы строка b разбираться с JSON.parse? Если я заменил все " на \" вручную, он хорошо разбирается, но я ищу автоматический путь.

ответ

1

Попробуйте использовать это:

b = b.replace(/"(?=[^\{]*\})/g, '\\"'); 

Это заменит все " в фигурных скобках на \".

Первая строка a становится на самом деле:

["{\"objects\":[],\"background\":\"#fff\"}","","","","","","","","",""] 

И это то, что вы должны сделать b стать, за исключением того, что сразу после создания переменной, она становится:

["{"objects":[],"background":"#fff"}","","","","","","","","",""] 

Так вы на самом деле поставить \ назад, где они должны быть.

Но так как вы пытаетесь разобрать JSON, вы могли бы быть лучше с:

b = JSON.stringify(b); 
+0

Строка - объекты JSON.stringified Fabric.js в массиве. Простой работает с вашим регулярным выражением, но немного сложнее сбой: http://jsbin.com/vexuk/3/edit. Любая идея почему? –

+0

@Timo Да, JS regexp не очень хорошо разбирает JSON, так же просто. В нем есть вложенные фигурные скобки, и, что еще хуже, регулярное выражение JS не имеет возможности справиться с этим. Если бы это был PHP, perl, C# или что-то в этом роде, это было бы возможно с регулярным выражением. Например, с помощью [PCRE] (http://regex101.com/r/tR3vO9). Но, к сожалению, регулярное выражение JS не обрабатывает рекурсию в regex ... – Jerry

+0

Итак, есть ли общее решение? –

5

точка использует 2 \:

b = b.replace(/"/g,'\\"') 

и результат:

[\"{\"objects\":[],\"background\":\"#fff\"}\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"] 

, как @isherwood, сказал:

To be more clear, the backslash is an escape character, so you need to double it so there's an actual character behind the escape.

+0

Чтобы быть более ясным, обратная косая черта является маскирующим, так что вы должны удвоить его таким образом, есть фактический характер позади выход. – isherwood

+1

'b = b.replace (/"/g, "\\") 'не работает: http://jsbin.com/vexuk/1/edit. Броски по-прежнему' SyntaxError: JSON Ошибка синтаксического анализа: непризнанный токен ' \ ''. –

+0

@isherwood: спасибо, я добавил ваше замечательное объяснение в ответ. –

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