2013-12-15 5 views
0

Я пытаюсь использовать регулярное выражение для добавления кавычек к любому числу в ответе JSON. Ниже приведен фрагмент из JSON. Любая помощь приветствуется.Проблема с Regex с ответом JSON

"videoIds":[2929365783001,2890489654001,2872798368001,...] 

    I need: 
    "videoIds":["2929365783001","2890489654001","2872798368001",...] 
+0

Любой ответ JSON, или только этот конкретный? Если это возможно, это невозможно сделать с помощью регулярного выражения. –

+0

Есть ли возможность исправить это в том месте, где этот JSON создается вместо потом? Вот пример того, как вы могли бы сделать это для этого конкретного сценария: http://regex101.com/r/fN7tA1 –

+0

@scrowler это ответ json от яркой вырезки. Я пытаюсь разобрать этот ответ в приложении Roku – kilomo

ответ

0

Вы не можете надежно сделать это с помощью регулярного выражения. Просто проанализируйте ответ как JSON, измените результирующую структуру данных и повторите сериализацию ее как JSON, если это необходимо. Вот как я хотел бы сделать это в Python:

data = json.loads(response) 
data["videoIds"] = [str(i) for i in data["videoIds"]] 
modified_response = json.dumps(data) 
0

Если предположить, что строка JSON называется str, вы можете попробовать несколько вещей:

  1. преобразовать JSON в объект JavaScript, а затем преобразовать содержимое массива «videoIds» в строки, как в:

    var obj=JSON.parse(str), 
        rv=[]; 
    obj.videoIds.forEach(function(elt){ 
        rv.push(elt.toString()); 
    }); 
    obj.videoIds=rv; 
    str=JSON.stringify(obj); 
    
  2. извлечь videoIds часть ул, регулярное выражение числа, чтобы добавить двойные кавычки, и заменить его:

    var matches=str.match(/"videoIds":\[([^\]]+)\]/), 
        targ=matches[0].replace(/[\[\]]/g,function(m){ return '\\'+m; }), // escape regex magic chars '[' and ']' 
        nums=matches[2].split(/,/), 
        rv='"videoIds":["'+nums.join('","')+'"]'; 
    
    str=str.replace(new Regex(targ),rv); // replace the extracted line 
    

Но в целом, это, вероятно, легче изменить исходный объект, прежде чем он будет преобразован в формат JSON, так что все цифры на самом деле являются строками.

+0

Это то, что я сейчас использую. % s/\ ([0-9] \ + \)/\ "\ 1 \" в vim – kilomo

+0

Что должно быть хорошо, если вы хотите преобразовать * все * номера в JSON в строки. Однако, если у вас уже есть числа, представленные в виде строк, RegExp, который вы используете, добавит к ним лишние кавычки. –

0

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

jsonstr = <<'LOD' 
{ 
    menu: { 
     id: "file", 
     "value": File, 
     "popup": { 
      "videoIds":[2929365783001,2890489654001,2872798368001,...], 
      toto:titi, 
      "\"glip":["glop\\",glup] 
     } 
    } 
} 
LOD 
jsonstr = jsonstr.gsub(
    /(?x) 
    ( # group 1: possible content before a value or key without double quotes 
     (?> 
      (?> "(?>[^"\\]++|\\{2}|\\.)*+")? # content inside double quotes 
      [\]\[}{:,\s]++     # spaces and special characters 
     )++ 
    ) 
    ([^\]\[{},:"]+?) # group 2: value or key without double quotes 
    (?= \s* (?: [\]:,}] | \z)) 
    /, 
    '\1"\2"') 
puts jsonstr 

Группа 1 используется для пропуска всех ключей или значений между двойными кавычками.

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