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 nullvà "null"giống nhau, như là 1và "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 _invà _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_outmà gọiJsonbToCstring
JsonbToCstringmà gọiJsonbToCStringWorker
JsonbToCStringWorkermà 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.