2015-05-25 5 views
1

У меня есть следующий сломана Javascript JSON строкаСинтаксических/манипулирование причудливо отформатированного JSON массив

[ 'some string's', 'inside, array', 60.4, 10.3, '' ] 

Я хотел бы разобрать эту сломанную строку JSON, Царапины от сценария части веб-страницы, в яваскрипта массива - но, как вы видите, это неправда json. Строки одинарные и могут также иметь одинарные кавычки внутри строки. Поэтому мне нужно заменить одиночные кавычки, окружающие строковые элементы двойными кавычками, без изменения одиночных кавычек внутри строки.

Любые чары с регулярным выражением здесь?

Обновление: Строки также могут содержать запятые, а также могут быть номерами.

Совет: Ищите шаблон ', ', чтобы отделить строковые элементы могли бы работать.

+0

То, что вы пытаетесь сделать, не регрессивно-разрешимо вообще. Это связано с тем, что регулярные выражения не работают с вложением. Для этого вам понадобится соответствующий парсер (что может быть нелегко реализовать), если у вас больше информации о вводе. Как например, это всегда плоский список. – freakish

+0

Измените код, создающий JSON, чтобы добавить обратную косую черту/экранирование или обернуть их двойными кавычками. – user2182349

+0

Я не могу изменить способ создания контента, так как я очистил данные с веб-страницы. – Erlend

ответ

1

Предполагая, что ваши «плохие» строки JSON всегда начинаются с [ ' и заканчиваются ' ], мы можем сначала «обрезать» строку, а затем разделить с помощью ', '.

var str = "[ 'some string's', 76, 'inside, array', '', 60.4, 10.3, '', 56 ]"; 
 
    str = str.replace(/^\[ | \]$/g, '') 
 
    var re = /'(.*?)'(?=,|$)|(\d+(?:\.\d+)?)(?=,|$)/g; 
 
    var m; 
 
    arr = []; 
 
    
 
    while ((m = re.exec(str)) !== null) { 
 
     if (m.index === re.lastIndex) { 
 
      re.lastIndex++; 
 
     } 
 
     if (m[1] != undefined) { 
 
      arr.push(m[1]); 
 
      document.getElementById("res").innerHTML += m[1] + "<br/>"; 
 
     } 
 
     else 
 
     { 
 
      arr.push(m[2]); 
 
      document.getElementById("res").innerHTML += m[2] + "<br/>"; 
 
     } 
 
    } 
 
    alert(arr);
<div id="res"/>

Однако, заметьте, что лучший способ исправить JSON, чтобы зафиксировать его на стороне поставщика JSON в. Если у вас более сложные строки JSON, это решение нуждается в улучшении.

+0

А что, если ',' является частью значения? На самом деле теперь, когда я думаю об этом, эта проблема не разрешима вообще. Взгляните на пример OP. Как мы знаем, что это массив из двух элементов, а не 1-элементный массив с 'some string ',' inside array' в качестве значения? Неоднозначность. – freakish

+0

Я также нашел запятые в некоторых строках - и я не могу его изменить, потому что я очистил его с веб-страницы. – Erlend

+0

Да, в этих случаях будет двусмысленность. Я предложил только способ для текущего примера. Я согласен, что это вообще неразрешимо. –