पोस्टग्रैज: जसन स्ट्रिंग को टेक्स्ट में कैसे बदलें?


93

Json मान में एक स्ट्रिंग मान शामिल हो सकता है। उदा .:

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

मैं उस स्ट्रिंग को पोस्टग्रेज टेक्स्ट वैल्यू के रूप में कैसे निकाल सकता हूं?

::TEXTकाम नहीं करता है। यह उद्धृत उद्धरण देता है, मूल स्ट्रिंग नहीं:

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

धन्यवाद।

PS मैं PostgreSQL 9.3 का उपयोग कर रहा हूं


stackoverflow.com/q/19414361/562459 मदद कर सकता है। शायद नहीं।
माइक शेरिल 'कैट रिकॉल'

स्ट्रिंग की सरणी के साथ समान समस्या, stackoverflow.com/q/45243186/287948
पीटर क्रूस

जवाबों:


57

एक स्केलर JSON ऑब्जेक्ट को फिर से बनाने के लिए PostgreSQL में कोई रास्ता नहीं है। इस प्रकार, जैसा कि आप बताते हैं,

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

15 है,

चाल को JSON को एक JSON तत्व के एक सरणी में बदलना है, फिर उस तत्व का उपयोग करके निकालें ->>

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

11 लौटेंगे।


8
यह एक दया है जो json_extract_path_text()मूल तत्व (AFAIK) को संदर्भित नहीं कर सकती है।
एरविन ब्रान्डसेट्टर

3
दिलचस्प बात यह है कि 2012 में एपीआई डिजाइनिंग स्टेज पर एक मंथन पर चर्चा हुई थी, जिसमें 2012 में एक समारोह from_jsonप्रस्तावित था, लेकिन इसे लागू नहीं किया गया wiki.postgresql.org/wiki/JSON_API_Brainstorm
nikon

146

9.4.4 में #>>ऑपरेटर मेरे लिए काम करता है:

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

तालिका स्तंभ के साथ उपयोग करने के लिए:

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

2
Postgres 9.4 में सबसे सरल समाधान लगता है। हालांकि 9.3 के लिए काम नहीं करता है।
e79ene

2
@hasen ओपी बताता है कि वह JSON मान से पाठ निकालने की कोशिश कर रहा है और to_json(...)यह केवल एक आसान तरीका है कि वह JSON मान बनाने के लिए एक छोटी पंक्ति विवरण में एक उदाहरण के रूप में काम करता है। यदि आप किसी तालिका का वर्णन कर रहे हैं तो निश्चित रूप से आप इसे JSON कॉलम के नाम से बदल देंगे। इसके अलावा, संभावित भ्रम के एक बिंदु को साफ करने के लिए, आपका कलाकार (...)::textनिरर्थक है क्योंकि #>>ऑपरेटर परिभाषा द्वारा पाठ लौटाता है (और पहले स्थान पर ऑपरेटर का उपयोग करने का कारण है)। आप कोष्ठक रख सकते हैं लेकिन कलाकारों को छोड़ सकते हैं ::text
इयान टिमोथी

1
कोई उल्लेख किया जा सका क्या #>>और '{}'कर रहे हैं? मैं इसका पालन नहीं कर सकता और न ही यह शब्द Google के अनुकूल है। इस जवाब ने मेरी समस्या को ठीक कर दिया, मैं सिर्फ यह जानना चाहता हूं कि क्यों।
वलदिल

1
@valadil #>>ऑपरेटर के लिए प्रलेखन यहाँ है
इयान टिमोथी

1
@valadil इस मामले में, एक शीर्ष स्तर, या रूट, JSON ऑब्जेक्ट है text। यह एक स्ट्रिंग की तरह लग सकता है लेकिन यह एक JSON ऑब्जेक्ट है। उस ऑब्जेक्ट को JSON से टेक्स्ट में बदलने के लिए, #>>ऑपरेटर का उपयोग करें । लेकिन उस ऑपरेटर को आपको एक पथ निर्दिष्ट करने की आवश्यकता है। उस मूल वस्तु का मार्ग है {}। तो SELECT '"test"'::jsonb #>> '{}'इसका अर्थ है "वस्तु को मूल मार्ग पर लाना और उसे पाठ में बदलना"।
इयान टिमोथी

3

श्री जिज्ञासु इस बारे में भी उत्सुक थे। #>> '{}'ऑपरेटर के अलावा , 9.6+ में ->>ऑपरेटर के साथ एक jsonb स्ट्रिंग का मूल्य प्राप्त कर सकते हैं :

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

यदि किसी के पास एक json मान है, तो समाधान पहले jsonb में डालना है:

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

0

इसे करने का एक आसान तरीका:

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

बस json स्ट्रिंग को json सूची में बदलें


0

-> मेरे लिए काम करता है।

संस्करण पोस्ट करता है:

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

प्रश्न:

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

आउटपुट:

  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

इंगित करने के लिए धन्यवाद, मैंने उपरोक्त संस्करण को सही किया
सुरिंदर

मूल प्रश्न यह है कि JSON स्ट्रिंग के मान को टेक्स्ट के साथ कैसे प्राप्त करें (कोई ऑब्जेक्ट कुंजी नहीं)। यह उत्तर कुंजी का उपयोग करते समय ->और उसके बीच का अंतर है ->>इस उत्तर को देखें या इस उत्तर को
इयान टिमोथी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.