Chúng ta có thể sử dụng SQLite json_remove()
chức năng xóa một hoặc nhiều phần tử khỏi đối tượng hoặc mảng 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 hoặc nhiều đường dẫn chỉ định phần tử nào cần loại bỏ. Theo "phần tử", tôi có nghĩa là phần tử mảng hoặc thành viên đối tượng (cặp khóa / giá trị).
Cú pháp
Cú pháp như sau:
json_remove(X,P,...)
Ở đâu X
đại diện cho JSON gốc và P,...
đại diện cho / các đường dẫn để xóa.
Ví dụ
Dưới đây là một ví dụ để chứng minh:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.age');
Kết quả:
{"name":"Fluffy"}
Ở đây, chúng tôi đã chỉ định $.age
và đó là những gì đã bị xóa khỏi tài liệu JSON.
Xóa nhiều thành viên
Chúng tôi có thể xóa nhiều thành viên khỏi một đối tượng JSON bằng cách chỉ định nhiều đường dẫn, được phân tách bằng dấu phẩy:
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'$.type',
'$.age'
);
Kết quả:
{"name":"Fluffy"}
Mảng
Chúng tôi có thể xóa các phần tử mảng bằng cách chỉ định chỉ mục của phần tử:
SELECT json_remove('[ 0, 1, 2, 3 ]', '$[2]');
Kết quả:
[0,1,3]
Mảng dựa trên 0 và do đó, việc đếm bắt đầu từ 0
.
Tuy nhiên, điều quan trọng là phải lưu ý đến thứ tự thực hiện các thao tác xóa. Việc xóa diễn ra tuần tự từ trái sang phải. Những thay đổi do lần xóa trước gây ra có thể ảnh hưởng đến việc tìm kiếm đường dẫn cho các đối số tiếp theo.
Dưới đây là một ví dụ về cách điều đó có thể ảnh hưởng đến kết quả của chúng tôi:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[0]',
'$[2]'
);
Kết quả:
[1,2]
Trong trường hợp này, phần tử mảng 0
đã bị xóa đầu tiên, sau đó đến phần tử mảng 2
đã bị xóa khỏi mảng còn lại. Nói cách khác, đường dẫn thứ hai đã xóa phần tử khỏi mảng sau khi đường dẫn đầu tiên đã bị xóa.
Mảng kết quả là mảng mà chúng ta có thể không lường trước được. Thay vì xóa các phần tử 0
và 2
khỏi mảng ban đầu, chúng tôi đã xóa các phần tử 0
và 3
từ mảng ban đầu.
Chúng tôi có thể khắc phục sự cố này bằng cách sắp xếp lại các đường dẫn:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[2]',
'$[0]'
);
Kết quả:
[1,3]
Không có đường dẫn
Các đối số đường dẫn thực sự là tùy chọn. Nếu chúng ta gọi json_remove()
không có đối số đường dẫn, nó trả về phiên bản rút gọn của JSON đầu vào (tức là đã loại bỏ khoảng trắng dư thừa):
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}'
);
Kết quả:
{"name":"Fluffy","type":"Cat","age":10}
Đây là kết quả tương tự mà chúng tôi sẽ nhận được nếu chúng tôi sử dụng json()
hàm thay vì json_remove()
.
Đường dẫn không tồn tại
Việc chỉ định một đường dẫn không tồn tại trong JSON đầu vào dẫn đến JSON ban đầu được trả về, không thay đổi:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.type');
Kết quả:
{"name":"Fluffy","age":10}
Đườ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_remove('{ "name" : "Fluffy", "age" : 10 }', 'age');
Kết quả:
Runtime error: JSON path error near 'age'
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_remove('{ "name" : "Fluffy", "age" }', '$.age');
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.