Postgres: Làm thế nào để chuyển đổi một chuỗi json thành văn bản?


93

Giá trị json có thể bao gồm một giá trị chuỗi. ví dụ.:

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

Làm cách nào để trích xuất chuỗi đó dưới dạng giá trị văn bản postgres?

::TEXTkhông hoạt động. Nó trả về json được trích dẫn, không phải chuỗi ban đầu:

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

Cảm ơn.

PS Tôi đang sử dụng PostgreSQL 9.3


stackoverflow.com/q/19414361/562459 có thể hữu ích. Có thể không.
Mike Sherrill 'Cat Recall'

Vấn đề tương tự với mảng các chuỗi, stackoverflow.com/q/45243186/287948
Peter Krauss

Câu trả lời:


58

Không có cách nào trong PostgreSQL để giải cấu trúc một đối tượng JSON vô hướng. Vì vậy, như bạn đã chỉ ra,

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

là 15,

Mẹo là chuyển đổi JSON thành một mảng của một phần tử JSON, sau đó trích xuất phần tử đó bằng cách sử dụng ->>.

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

sẽ trở lại 11.


8
Rất tiếc json_extract_path_text()không thể tham chiếu phần tử gốc (AFAIK).
Erwin Brandstetter

3
thú vị là, có một cuộc thảo luận động não dường như quay trở lại giai đoạn thiết kế API vào năm 2012, trong đó một chức năng from_jsonđã được đề xuất, nhưng không được triển khai wiki.postgresql.org/wiki/JSON_API_Brainstorm
nikola 19/02/15

146

Trong 9.4.4 sử dụng #>>toán tử hoạt động cho tôi:

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

Để sử dụng với một cột trong bảng:

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

2
Có vẻ là giải pháp đơn giản nhất trong Postgres 9.4. Tuy nhiên không hoạt động cho 9.3.
e79ene

2
@hasen OP nói rằng anh ấy đang cố gắng trích xuất văn bản từ một giá trị JSON và to_json(...)đây chỉ đơn giản là một cách dễ dàng để tạo một giá trị JSON để làm việc với nó như một ví dụ trong một câu lệnh ngắn một dòng. Chắc chắn bạn sẽ thay thế nó bằng tên của một cột JSON nếu bạn đang truy vấn một bảng như bạn mô tả. Ngoài ra, để giải quyết một điểm có khả năng nhầm lẫn, việc ép kiểu của bạn (...)::textlà thừa vì #>>toán tử trả về văn bản theo định nghĩa (và là lý do để sử dụng toán tử ngay từ đầu). Bạn có thể giữ lại dấu ngoặc đơn nhưng bỏ diễn viên ::text.
Ian Timothy

1
Ai đó có thể đánh vần những gì #>>'{}'đang làm? Tôi không thể làm theo điều này và không có thuật ngữ nào thân thiện với google. Câu trả lời này đã giải quyết vấn đề của tôi, tôi chỉ muốn biết tại sao.
valadil

1
@valadil Tài liệu dành cho #>>nhà điều hành có ở đây .
Ian Timothy

1
@valadil Trong trường hợp này, có một đối tượng JSON cấp cao nhất hoặc gốc text. Nó có thể trông giống như một chuỗi nhưng nó là một đối tượng JSON. Để chuyển đổi đối tượng đó từ JSON thành văn bản, hãy sử dụng #>>toán tử. Nhưng toán tử đó cần bạn chỉ định một đường dẫn. Đường dẫn đến đối tượng gốc đó là {}. Vì vậy, SELECT '"test"'::jsonb #>> '{}'có nghĩa là "lấy đối tượng tại đường dẫn gốc và chuyển đổi nó thành văn bản".
Ian Timothy

3

Ông Curious cũng tò mò về điều này. Ngoài #>> '{}'toán tử, trong 9,6+ người ta có thể nhận giá trị của một chuỗi jsonb với ->>toán tử:

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

Nếu một giá trị json, thì giải pháp là chuyển thành jsonb trước:

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

0

Một cách dễ dàng để làm điều này:

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

Chỉ cần chuyển đổi chuỗi json thành một danh sách json


0

- >> làm việc cho tôi.

phiên bản postgres:

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

Truy vấn:

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

Đầu ra:

  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

Cảm ơn vì đã chỉ ra, tôi đã sửa phiên bản ở trên
Surinder

Câu hỏi ban đầu là làm thế nào để nhận giá trị của chuỗi JSON dưới dạng văn bản với (không có khóa đối tượng). Câu trả lời này chỉ là sự khác biệt giữa ->->>khi sử dụng một phím. Xem câu trả lời này hoặc câu trả lời này .
Ian Timothy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.