পোস্টগ্রিস: জেসন স্ট্রিংটিকে পাঠ্যে রূপান্তর করবেন কীভাবে?


94

জসন মান একটি স্ট্রিং মান হতে পারে। যেমন:

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 সাহায্য করতে পারে। না পারে।
মাইক শেরিল 'ক্যাট রিকল'

স্ট্রিংয়ের অ্যারের সাথে একই সমস্যা, স্ট্যাকওভারফ্লো.com
পিটার ক্রাউস

উত্তর:


59

পোস্টগার্রেএসকিউএল-এ কোনও স্কেলার জেএসএন বস্তুটি ডিকনস্ট্রাক্ট করার উপায় নেই। সুতরাং, আপনি উল্লেখ হিসাবে,

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()মূল উপাদানটির (এএফএআইকি) উল্লেখ করতে পারে না।
এরউইন ব্র্যান্ডস্টেটার

4
মজার ব্যাপার হচ্ছে, সেখানে একটি চিন্তাভাবনার আলোচনা দৃশ্যত 2012 সালে এপিআই নকশা পর্যায় যা একটি ফাংশন ফিরে ছিল from_jsonপ্রস্তাবিত পেয়েছিলাম, কিন্তু বাস্তবায়িত হয়নি wiki.postgresql.org/wiki/JSON_API_Brainstorm
নিকোলা

154

9.4.4 এ #>>অপারেটর ব্যবহার করে আমার জন্য কাজ করে :

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

একটি টেবিল কলাম সহ ব্যবহার করতে:

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

4
পোস্টগ্রিস 9.4-এর সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে। তবে 9.3 এর জন্য কাজ করে না।
e79ene

4
@ হাসান ওপি জানিয়েছে যে তিনি একটি জেএসওএন মান থেকে পাঠ্য বের করার চেষ্টা করছেন এবং to_json(...)সংক্ষিপ্ত এক লাইনের বিবৃতিতে উদাহরণ হিসাবে কাজ করার জন্য একটি জেএসওএন মান তৈরি করার সহজ উপায়। আপনি যদি বর্ণনা অনুযায়ী কোনও সারণী জিজ্ঞাসাবাদ করে থাকেন তবে অবশ্যই আপনি এটি JSON কলামের নাম দিয়ে প্রতিস্থাপন করবেন। এছাড়াও, সম্ভাব্য বিভ্রান্তির একটি বিষয় পরিষ্কার করতে, অপারেটর সংজ্ঞা অনুসারে পাঠ্য ফেরত দেওয়ার কারণে আপনার কাস্ট (...)::textঅপ্রয়োজনীয় #>>(এবং অপারেটরটিকে প্রথম স্থানে ব্যবহারের কারণ)। আপনি বন্ধনী রাখতে পারেন তবে কাস্ট ফেলে দিতে পারেন ::text
ইয়ান টিমোথি

4
কেউ কি বানান করতে পারে #>>এবং '{}'কী করছে? আমি এটি পুরোপুরি অনুসরণ করতে পারি না এবং কোনও শব্দই গুগল বান্ধব নয়। এই উত্তরটি আমার সমস্যার সমাধান করেছে, আমি কেবল কেন তা জানতে চাই।
ভালাদিল

4
@ ভালাদিল #>>অপারেটরের জন্য ডকুমেন্টেশন এখানে
আয়ান টিমোথি

4
@ ভালাদিল এই ক্ষেত্রে, শীর্ষ স্তরের, বা মূল, জেএসওএন অবজেক্ট রয়েছে text। এটি স্ট্রিংয়ের মতো দেখতে পারে তবে এটি একটি JSON অবজেক্ট। JSON থেকে পাঠ্যে রূপান্তর করতে, #>>অপারেটরটি ব্যবহার করুন । তবে সেই অপারেটরের আপনার কোনও পাথ নির্দিষ্ট করা দরকার। সেই রুট অবজেক্টের পথ {}। সুতরাং এর SELECT '"test"'::jsonb #>> '{}'অর্থ "মূল পথে অবজেক্টটি পান এবং এটি পাঠ্যে রূপান্তর করুন"।
ইয়ান টিমোথি

3

মিঃ কৌতূহলীও এটি সম্পর্কে কৌতূহলী ছিলেন। #>> '{}'অপারেটর ছাড়াও , 9.6+ এ একজন ->>অপারেটরের সাথে একটি জসনব স্ট্রিংয়ের মান পেতে পারে :

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

যদি কারও একটি জসন মান থাকে, তবে সমাধানটি প্রথমে জসনব মধ্যে কাস্ট করা হয়:

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

1

- >> আমার জন্য কাজ করে।

পোস্টগ্রিজ সংস্করণ:

<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

নির্দেশ করার জন্য ধন্যবাদ, আমি উপরের সংস্করণটি সংশোধন করেছি
সুরিন্দর

আসল প্রশ্নটি কীভাবে কোনও জেএসএন স্ট্রিংয়ের মান (কোনও অবজেক্ট কী নয়) সহ পাঠ্য হিসাবে পাবেন। এই উত্তরটি কোনও কী ব্যবহার করার সময় ->এবং কেবলমাত্র পার্থক্য ->>। দেখুন এই উত্তর বা এই উত্তর
আয়ান টিমোথি

0

এটি করার একটি সহজ উপায়:

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

কেবল জসন স্ট্রিংটিকে একটি জসন তালিকায় রূপান্তর করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.