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ừ text
một json
chuỗ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 jsonb
vớ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
và "null"
giống nhau, như là 1
và "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 _out
cái đưa chúng đến text
hoặc _send
đưa chúng đến biểu diễn nhị phân và đối ứng _in
và _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
,
jsonb_out
mà gọiJsonbToCstring
JsonbToCstring
mà gọiJsonbToCStringWorker
JsonbToCStringWorker
mà gọijsonb_put_escaped_value
jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)
mà gọiescape_json
escape_json(StringInfo buf, const char *str)
trong đó thêm"
và nó được mã hóa cứng. Không con cach nao khac.