SQLite json_insert()
cho phép chúng tôi chèn một giá trị mới vào tài liệu JSON.
Chúng tôi chuyển JSON ban đầu làm đối số đầu tiên khi chúng tôi gọi hàm, theo sau là một đường dẫn chỉ định vị trí để chèn giá trị mới, tiếp theo là giá trị để chèn.
Chúng tôi cũng có thể chèn nhiều cặp khóa / giá trị nếu được yêu cầu.
Cú pháp
Hàm được gọi như thế này:
json_extract(json, path1, value1, path2, value2...)
Ở đâu json
đại diện cho JSON gốc và path1, value1, path2, value2...
là các cặp đường dẫn / giá trị mà chúng ta có thể sử dụng để chèn các giá trị mới vào tài liệu JSON.
Ví dụ
Dưới đây là một ví dụ cơ bản để chứng minh:
SELECT json_insert('{ "a" : 1 }', '$.b', 2);
Kết quả:
{"a":1,"b":2}
Tại đây, tôi đã chèn một cặp khóa / giá trị mới ("b":2
) vào tài liệu JSON.
Chúng tôi có thể chèn nhiều cặp khóa / giá trị như thế này:
SELECT json_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Kết quả:
{"a":1,"b":2,"c":3}
Tôi chỉ cần thêm nhiều đối số khóa / giá trị hơn khi tôi gọi json_insert()
.
Khóa / Giá trị đã Tồn tại?
json_insert()
hàm sẽ không chèn giá trị nếu khóa đã tồn tại:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Kết quả:
{"a":1}
Trong trường hợp này, khóa a
đã tồn tại trong JSON và vì vậy việc cố gắng chèn một giá trị mới cho khóa đó không hoạt động.
Để thay thế một giá trị, hãy sử dụng json_replace()
hoặc json_set()
.
Chèn một đối tượng
Dưới đây là một ví dụ về cách chèn một tài liệu JSON khác:
SELECT json_insert('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Kết quả:
{"a":1,"b":{"c":2}}
Trong trường hợp này, tôi đã sử dụng json()
hàm trả về đối số của tôi dưới dạng chuỗi JSON. Đây là những gì sẽ xảy ra khi tôi không làm điều đó:
SELECT json_insert('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Kết quả:
{"a":1,"b":"{ \"c\" : 2 }"}
Tài liệu JSON được chèn dưới dạng giá trị văn bản thay vì đối tượng JSON và do đó dấu ngoặc kép của nó được thoát bằng dấu gạch chéo ngược.
Điều này là đủ công bằng mặc dù. Sau cùng, chúng tôi đã đặt giá trị mới trong dấu ngoặc kép. Làm cách nào để SQLite biết liệu chúng ta muốn chèn một chuỗi hay một đối tượng JSON?
Và chúng ta không thể đơn giản loại bỏ những dấu ngoặc kép đó:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Kết quả:
Parse error: unrecognized token: "{" SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Không có dấu ngoặc kép hoặc json()
, chúng tôi gặp lỗi ngay khi nó gặp phải dấu ngoặc nhọn bên trái.
Một cách khác để chèn một đối tượng JSON là sử dụng json_object()
thay vì json()
chức năng:
SELECT json_insert('{ "a" : 1 }', '$.b', json_object('c', 2) );
Kết quả:
{"a":1,"b":{"c":2}}
Chèn một mảng
Điều tương tự khi chèn mảng:
SELECT json_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Kết quả:
{"a":1,"b":[2,3,4]}
Nếu chúng ta xóa json()
, chúng tôi nhận được cái này:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Kết quả:
{"a":1,"b":"[ 2, 3, 4 ]"}
Và nếu chúng tôi xóa các dấu ngoặc kép, chúng tôi sẽ gặp lỗi:
SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Kết quả:
Parse error: no such column: 2, 3, 4 SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); error here ---^
Ngoài ra, chúng ta có thể sử dụng json_array()
hàm thay vì json()
. Hàm đó cho phép bạn tạo một mảng dựa trên các đối số của nó:
SELECT json_insert('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Kết quả:
{"a":1,"b":[2,3,4]}
Nối Giá trị vào cuối Mảng
Chúng ta có thể sử dụng json_insert()
để nối các giá trị vào cuối một mảng.
Để thực hiện việc này, hãy sử dụng chỉ mục mảng của [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Kết quả:
[1,2,3,4]
Nguyên tắc tương tự cũng áp dụng cho các mảng lồng nhau:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Kết quả:
[1,["a","b","c"],3]
Đường dẫn không hợp lệ
Chúng tôi sẽ gặp lỗi nếu đường dẫn của chúng tôi không đúng:
SELECT json_insert('{ "a" : 1 }', 'b', 2);
Kết quả:
Runtime error: JSON path error near 'b'
Trong trường hợp này, tôi đã quên bao gồm $.
ở phía trước của con đường.
Tài liệu JSON không hợp lệ
Chúng tôi cũng sẽ gặp lỗi do JSON không được định dạng tốt:
SELECT json_insert('{ "a" : 1', '$.b', 2);
Kết quả:
Runtime error: malformed JSON
Lần này, lỗi cho chúng tôi biết rằng JSON của chúng tôi không đúng định dạng.