Postgres: Bir json dizesini metne nasıl dönüştürebilirim?


93

Json değeri bir dize değerinden oluşabilir. Örneğin.:

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

Bu dizeyi postgres metin değeri olarak nasıl çıkarabilirim?

::TEXTçalışmıyor. Orijinal dizeyi değil, alıntılanan json'ı döndürür:

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

Teşekkürler.

PS PostgreSQL 9.3 kullanıyorum



Dizeleri dizisi ile benzer sorun stackoverflow.com/q/45243186/287948
Peter Krauss

Yanıtlar:


58

PostgreSQL'de skaler bir JSON nesnesini yeniden yapılandırmanın bir yolu yoktur. Böylece, belirttiğiniz gibi,

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

15

İşin püf noktası, JSON'u bir JSON öğesi dizisine dönüştürmek, ardından bu öğeyi kullanarak ayıklamaktır ->>.

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

11 dönecektir.


8
json_extract_path_text()Kök öğeye (AFAIK) atıfta bulunamayan üzücü .
Erwin Brandstetter

3
ilginç bir şekilde, görünüşe göre 2012'de API tasarım aşamasında bir beyin fırtınası tartışması vardı, burada bir fonksiyon from_jsonönerildi, ancak uygulanmadı wiki.postgresql.org/wiki/JSON_API_Brainstorm
nikola

148

9.4.4'te #>>operatörü kullanmak benim için çalışıyor:

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

Bir tablo sütunuyla kullanmak için:

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

2
Postgres 9.4'teki en basit çözüm gibi görünüyor. Ancak 9.3 için çalışmaz.
e79ene

2
@hasen OP, bir JSON değerinden metin çıkarmaya çalıştığını ve to_json(...)kısa bir tek satırlık ifadede örnek olarak çalışmak için bir JSON değeri oluşturmanın basit bir yolu olduğunu belirtir . Açıkladığınız gibi bir tabloyu sorguluyor olsaydınız, kesinlikle bir JSON sütununun adıyla değiştirirdiniz. Ayrıca, olası bir karışıklık noktasını gidermek için (...)::text, #>>operatör tanım gereği metin döndürdüğünden (ve ilk etapta operatörü kullanmanın nedenidir) dökümünüz gereksizdir . Parantezleri tutabilirsin ama dökümleri çıkarabilirsin ::text.
Ian Timothy

1
Birisi ne büyü Could #>>ve '{}'yapıyoruz? Bunu tam olarak takip edemiyorum ve iki terim de google dostu değil. Bu cevap sorunumu çözdü, sadece nedenini bilmek istiyorum.
valadil

1
@valadil #>>Operatörün dokümantasyonu burada .
Ian Timothy

1
@valadil Bu durumda, bir üst seviye veya kök JSON nesnesi vardır text. Bir dizge gibi görünebilir ama bir JSON nesnesidir. Bu nesneyi JSON'dan metne dönüştürmek için #>>operatörü kullanın . Ancak bu operatörün bir yol belirlemenize ihtiyacı var. Bu kök nesnenin yolu {}. Yani SELECT '"test"'::jsonb #>> '{}'"nesneyi kök yolundan al ve onu metne dönüştür" demektir.
Ian Timothy

3

Bay Curious da bunu merak ediyordu. #>> '{}'Operatöre ek olarak, 9.6+ sürümünde operatörle bir jsonb dizesinin değeri alınabilir ->>:

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

Bir json değerine sahipse, çözüm önce jsonb'ye çevirmektir:

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

0

Bunu yapmanın kolay bir yolu:

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

Sadece json dizesini json listesine dönüştürün


0

- >> benim için çalışıyor.

postgres sürümü:

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

Sorgu:

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

Çıktı:

  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

İşaret ettiğiniz için teşekkürler, yukarıdaki sürümü düzelttim
Surinder

Asıl soru, bir JSON dizesinin değerinin metin olarak (nesne anahtarı olmadan) nasıl alınacağıdır. Bu cevap sadece arasındaki farktır ->ve ->>bir anahtar kullanarak. Bkz bu cevabı veya bu cevabı .
Ian Timothy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.