Postgres: come convertire una stringa json in testo?


93

Il valore Json può essere costituito da un valore stringa. per esempio.:

postgres=# SELECT to_json('Some "text"'::TEXT);
     to_json
-----------------
 "Some \"text\""

Come posso estrarre quella stringa come valore di testo postgres?

::TEXTnon funziona. Restituisce json citato, non la stringa originale:

postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
     to_json
-----------------
 "Some \"text\""

Grazie.

PS Sto usando PostgreSQL 9.3



Problema simile con array di stringhe, stackoverflow.com/q/45243186/287948
Peter Krauss

Risposte:


58

Non c'è modo in PostgreSQL di decostruire un oggetto JSON scalare. Quindi, come fai notare,

select  length(to_json('Some "text"'::TEXT) ::TEXT);

è 15,

Il trucco è convertire il JSON in un array di un elemento JSON, quindi estrarre quell'elemento usando ->>.

select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );

tornerà 11.


8
È un peccato che json_extract_path_text()non possa fare riferimento all'elemento radice (AFAIK).
Erwin Brandstetter

3
È interessante notare che c'è stata una discussione di brainstorming apparentemente nella fase di progettazione dell'API nel 2012 in cui una funzione è from_jsonstata proposta, ma non implementata wiki.postgresql.org/wiki/JSON_API_Brainstorm
nikola

147

In 9.4.4 l'utilizzo #>>dell'operatore funziona per me:

select to_json('test'::text) #>> '{}';

Da utilizzare con una colonna della tabella:

select jsoncol #>> '{}' from mytable;

2
Sembra essere la soluzione più semplice in Postgres 9.4. Tuttavia non funziona per 9.3.
e79ene

2
@hasen L'OP afferma che sta cercando di estrarre del testo da un valore JSON ed to_json(...)è semplicemente un modo semplice per creare un valore JSON con cui lavorare come esempio in una breve istruzione di una riga. Certamente lo sostituiresti con il nome di una colonna JSON se stavi interrogando una tabella come descrivi. Inoltre, per chiarire un punto di potenziale confusione, il cast (...)::textè ridondante poiché l' #>>operatore restituisce il testo per definizione (ed è il motivo per utilizzare l'operatore in primo luogo). Potresti mantenere le parentesi ma lascia perdere il cast ::text.
Ian Timothy

1
Qualcuno potrebbe precisare cosa #>>e '{}'stanno facendo? Non riesco a seguirlo e nessuno dei due termini è compatibile con Google. Questa risposta ha risolto il mio problema, voglio solo sapere perché.
valadil

1
@valadil La documentazione per l' #>>operatore è qui .
Ian Timothy

1
@valadil In questo caso, è presente un oggetto JSON di primo livello, o radice text. Potrebbe sembrare una stringa ma è un oggetto JSON. Per convertire quell'oggetto da JSON in testo, utilizza l' #>>operatore. Ma quell'operatore richiede che tu specifichi un percorso. Il percorso per quell'oggetto radice è {}. Quindi SELECT '"test"'::jsonb #>> '{}'significa "prendi l'oggetto nel percorso principale e convertilo in testo".
Ian Timothy

3

Anche il signor Curious era curioso di questo. Oltre #>> '{}'all'operatore, in 9.6+ si può ottenere il valore di una stringa jsonb con l' ->>operatore:

select to_jsonb('Some "text"'::TEXT)->>0;
  ?column?
-------------
 Some "text"
(1 row)

Se uno ha un valore json, la soluzione è prima eseguire il cast in jsonb:

select to_json('Some "text"'::TEXT)::jsonb->>0;
  ?column?
-------------
 Some "text"
(1 row)

0

Un modo semplice per farlo:

SELECT  ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;

Basta convertire la stringa json in un elenco json


0

- >> funziona per me.

versione postgres:

<postgres.version>11.6</postgres.version>

Query:

select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;

Produzione:

  asofJson       asofText
"2020-06-26"    2020-06-26
"2020-06-25"    2020-06-25
"2020-06-25"    2020-06-25
"2020-06-25"    2020-06-25

Grazie per averlo sottolineato, ho corretto la versione sopra
Surinder

La domanda originale è come ottenere il valore di una stringa JSON come testo con (nessuna chiave dell'oggetto). Questa risposta è solo la differenza tra ->e ->>quando si utilizza una chiave. Vedi questa o questa risposta .
Ian Timothy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.