Estoy tratando de analizar datos en JSON. Los datos se ven así:

[{ 
    'Id': 1,
    'FirstName': 'bob',
    'LastName': '',
    'Description': 'description can include escaped single quotes: \'.' 
}]

Cómo debería ser el resultado:

[{ 
    "Id": 1,
    "FirstName": "bob",
    "LastName": "",
    "Description": "description can include escaped single quotes: \'."
}]

El punto es reemplazar todas las comillas simples sin escape con comillas dobles, dejando solo las comillas escapadas.

Tengo regex que ya funciona bien en la conversión de comillas simples en comillas dobles para JSON, mientras que ignoro las comillas simples escapadas.

/((?!\\).{1}|^.{0,0})\'/g

Problema: El problema es que para el bit 'LastName': '', solo reemplaza la primera cita con un "y no el segundo ... convirtiéndolo en esto: "LastName": "' que es JSON inválido.

Pregunta: ¿Cómo puedo modificar mi expresión regular para asegurarme de que ambas comillas simples sean reemplazadas? Siento que ejecutar string.replace dos veces seguidas es una solución sucia ...

2
Vlad 22 mar. 2017 a las 23:40

2 respuestas

La mejor respuesta

Creo que almacenar sus datos en una variable de JavaScript y usar JSON.stringify será la mejor manera de lograr lo que está tratando de hacer. Se encargará de escapar de personajes especiales para ti y no tienes que seguir manteniendo tu Regex para manejar más escenarios.

obj=[{  'Id': 1,  'FirstName': 'bob', 'LastName': '', 'Description': 'description can include escaped single quotes: \'.'}]
str=JSON.stringify(obj)

Después de esto, su str tendrá este valor: [{"Id": 1, "Nombre": "bob", "Apellido": "", "Descripción": "la descripción puede incluir comillas simples escapadas: '."}]

2
alpeshpandya 22 mar. 2017 a las 21:51

Lookbehind no es compatible con javascript. Tampoco puedes hacerlo con una anticipación positiva. Hay una manera más confiable de hacer esto sin pensar en buscar en absoluto:

var str = str = `[{ 
    'Id': '',
    'FirstName': 'bo\\\\\\\\'b',
    'LastName': '',
    'Description': 'des\\\\\\'cription can\\\\' include \\\\\\\\'escaped\\'single quotes: \\'.' 
}]`;

console.log(str.replace(/(\\\\)+(')|\\+'|(')/g, function(match, p1, p2, p3) {
    return p2 ? p1 + '\\"' : (p3 ? '"' : match);
}));
1
revo 22 mar. 2017 a las 21:30