Hay datos JSON que contienen algunos valores numéricos. ¿Cómo convertir todos los números a cadenas? (envolver con comillas)
Ejemplo:
{
"id":1,
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":1000,
"pndNumber":20000,
"zoneNumber":4
}
debe convertirse
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}
{"a":{"b":1},"b":null}
a{ "a": "{\"b\":1}", "b": "null" }
null
(aún vale la pena señalar IMO, aunque la muestra del OP no tiene ninguno de esos).Aquí hay una solución fácil basada en la
jtc
utilidad Unix:si desea aplicar cambios directamente en el archivo json, use el
-f
interruptor, de esta manera:La solución propuesta funcionará correctamente con un json estructurado arbitrario, por ejemplo:
-w'<>n:'
-w'<any>b:'
Además, la tarea inversa (poner entre comillas todos los números) se logra fácilmente de la misma manera: digamos,
file.json
ya está "entrecomillado", para poner entre comillas todos los números:ACTUALIZACIÓN : la última versión de
jtc
implementos ahora plantillas y espacios de nombres. Con eso no se requiere invocación de shell externo:jtc
guía del usuario: https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.mdfuente
Citaría cualquier cosa que no se cite y no
[]{}:,whitespace
se cite, así que citaría númerostrue
,false
ynull
.Citaría específicamente lo que coincide con la especificación de un número json y eso no está dentro de las comillas.
Esos hacen una tokenización exacta basada en la especificación JSON, no es una aproximación.
fuente
Intenté con el siguiente método y funcionó bien.
Conduje 2 veces hasta mi nivel para reducirlo
Mando:
Salida:
fuente
\{1,\},
? Para probar si un elemento aparece una o más veces, use+
. Y esto no funcionará para números como -123, 0xab, 0o12, 0b1011, 1e23 o 1.2e3 ...\{1,\}
es el equivalente BRE de ERE+
. Algunassed
implementaciones admiten\+
como una extensión o una-E
o-r
opción para activar EREs pero eso no es portátil.\?
es otra extensión no portátil, aunque cuyo equivalente estándar es\{0,1\}