Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

847
Views
Usando PostgreSQL, ¿cómo escapo "\" en las columnas json?

Estoy usando Postgres 9.5 y tengo una columna ("info") de tipo 'json'... Estoy tratando de hacer esta inserción:

 INSERT INTO table ( info ) VALUES ( '{"entry":"((\+)[0-9]+)"}' )

pero me sale este error:

 ERROR: invalid input syntax for type json DETAIL: Escape sequence "\+" is invalid.

Está interpretando \+ como una secuencia de escape, pero en realidad quiero eso como parte de mi valor.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

En general,

  • si tiene claves y valores, use jsonb_build_object para construir el objeto
  • si está escribiendo un objeto JSON literal para convertirlo desde una cadena, entonces debe ser correcto; una cadena JSON adecuada requiere escapar \ .

Explicación

PostgreSQL no cita esto: es solo la implementación de JSON después de RFC 7159 .

Una cadena comienza y termina con comillas. Todos los caracteres Unicode se pueden colocar entre comillas, excepto los caracteres que se deben escapar: comillas, sólido inverso y los caracteres de control (U+0000 a U+001F). [... ] Entonces, por ejemplo, una cadena que contiene solo un único carácter solidus inverso puede representarse de manera más compacta como "\\" .

Entonces se ve así en la forma literal.

 CREATE TABLE tbl AS SELECT '{"entry":"((\\+)[0-9]+)"}'::jsonb AS info;

La cotización de dólares en PostgreSQL no requiere escapes, pero no ayudará aquí,

Tenga en cuenta que dentro de la cadena cotizada en dólares, se pueden usar comillas simples sin necesidad de escapar. De hecho, ningún carácter dentro de una cadena cotizada en dólares nunca se escapa : el contenido de la cadena siempre se escribe literalmente. Las barras invertidas no son especiales, ni tampoco los signos de dólar, a menos que formen parte de una secuencia que coincida con la etiqueta de apertura.

Entonces esto no funcionará porque \+ no es una cadena válida en JSON. Sin embargo, funcionaría si no estuviéramos usando un tipo json.

 SELECT '{"key":"\"}'::jsonb; ERROR: invalid input syntax for type json LINE 1: SELECT '{"key":"\"}'::jsonb; ^ DETAIL: Token ""\"}" is invalid. CONTEXT: JSON data, line 1: {"key":"\"}

Sin embargo, puede usar to_jsonb() para escapar de JSON de las cadenas.

 SELECT FORMAT( $${%s:%s}$$, to_jsonb(k), to_jsonb(v) )::jsonb FROM ( VALUES ('key', '\' ) ) AS t(k,v);

Pero incluso esto es una mala idea porque si tiene las claves y los valores, puede usar json_build_object ,

 SELECT jsonb_build_object( k, v ) FROM ( VALUES ('key', '\' ) ) AS t(k,v);
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!