Hủy bỏ chuỗi JSON; in chuỗi JSON không có dấu ngoặc kép


12
SELECT json_array_elements('["one", "two"]'::json)

cho kết quả

| json_array_elements |
| : ------------------ |
| "một" |
| "hai" |

Tôi muốn có cùng nhưng không có dấu ngoặc kép:

one
two

Có vẻ như tôi không thể sử dụng ->>ở đây vì tôi không có tên trường trong JSON. Nó chỉ là một chuỗi các chuỗi.

Phiên bản Postgres: PostgreSQL 10.0 trên x86_64-apple-darwin, được biên soạn bởi i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Dựa trên Apple Inc. build 5658) (LLVM build 2336.11.00), 64- bit


Phiên bản nào của PostgreSQL?
Vérace

1
Câu hỏi này có câu trả lời tại đây: dba.stackexchange.com/a/57121/110455
McNets

@McNets - Thế này thì sao?
Vérace

@ Vérace trên db-fiddle hiển thị kết quả mà không có dấu ngoặc kép nhưng dbfiddle.uk hiển thị kết quả có dấu ngoặc kép. Tôi không thể kiểm tra nó trên VM postgres của mình (tôi không nhớ mật khẩu) nhưng tôi cho rằng nó sẽ hiển thị các trích dẫn.
McNets

2
@ Vérace psql cũng hiển thị nó với dấu ngoặc kép
McNets

Câu trả lời:


10

Việc json->textép buộc mặc định xuất ra với một trích dẫn kép ( ") bởi vì việc ép buộc từ textmột jsonchuỗi yêu cầu bạn phải trích dẫn hai lần đầu vào của mình. Để thoát khỏi dấu ngoặc kép, sử dụngTRIM

SELECT x, trim('"' FROM x::text)
FROM json_array_elements('["one", "two"]'::json) AS t(x);
   x   | btrim 
-------+-------
 "one" | one
 "two" | two
(2 rows)

Điểm quan trọng, bạn sẽ mất một số tiện ích nếu bạn làm điều đó. Tất cả các loại JSONB được trả về ở dạng văn bản có thể được sử dụng để quay lại jsonbvới sự text->jsonbép buộc. Đây là một chức năng ánh xạ phỏng đoán. Mất điều đó có nghĩa null"null"giống nhau, như là 1"1".

SELECT x, trim('"' FROM x::text)
FROM json_array_elements('[null, "null", 1, "1"]') AS t(x);
   x    | btrim 
--------+-------
 null   | null
 "null" | null
 1      | 1
 "1"    | 1
(4 rows)

Nội bộ ..

Nếu bạn muốn biết những gì đang xảy ra. Tất cả các loại có thể cung cấp một _outcái đưa chúng đến texthoặc _sendđưa chúng đến biểu diễn nhị phân và đối ứng _in_recvđưa chúng từ các biểu mẫu đó và ánh xạ trở lại các loại. Ở đây bạn đang nhận được jsonb_out,

  1. jsonb_outgọiJsonbToCstring
  2. JsonbToCstringgọiJsonbToCStringWorker
  3. JsonbToCStringWorkergọijsonb_put_escaped_value
  4. jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)gọiescape_json
  5. escape_json(StringInfo buf, const char *str)trong đó thêm" và nó được mã hóa cứng. Không con cach nao khac.

11
SELECT value#>>'{}' as col FROM json_array_elements('["one", "two"]'::json);

Kết quả:

col
---
one
two

Như một lời giải thích: Các toán tử chứa >>dường như thường chuyển đổi một JSON thành văn bản không có dấu vết: postgresql.org/docs/civerse/fifts-json.html . Câu trả lời này có lẽ thích hợp hơn vì việc thoát có lẽ không giới hạn trong việc thêm dấu ngoặc kép, nhưng cũng thoát khỏi dấu ngoặc kép trong văn bản và một số ký tự đặc biệt. Các mẫu ở trên chỉ xảy ra không chứa bất kỳ. (Có lẽ là vì tôi đã không kiểm tra nó.)
Denis Nethercher

Thay vào đó #>>là một toán tử JSON để trả về một đối tượng tại một đường dẫn, hãy xem: postgresql.org/docs/10/fifts-json.html
jso
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.