Khi sử dụng System.Text.Json để thực hiện các thao tác tuần tự hóa và giải tuần tự hóa JSON, chúng ta sẽ gặp một vấn đề: làm thế nào để xử lý vấn đề Key trong từ điển là loại tùy chỉnh.
Thông tin cơ bản
Ví dụ: chúng tôi có đoạn mã sau:
//
Xác định loại tùy chỉnh
công cộng
lớp học
Kiểu tùy chỉnh {
công cộng
số nguyên
Nhận dạng {
lấy
;
bộ
; }
công cộng
sợi dây
Tên {
lấy
;
bộ
; }
//
Lấy khóa được biểu thị bằng một chuỗi
công cộng
sợi dây
Chìa khóa => $
"
{Id}_{Tên}
"
; }
//
Xác định một đối tượng thuộc loại Từ điển
Từ điển
sợi dây
> từ điển =
mới
Từ điển
sợi dây
>
{ {
mới
Kiểu tùy chỉnh { Id =
1
, Tên =
"
một
"
},
"
một
"
}, {
mới
Kiểu tùy chỉnh { Id =
2
, Tên =
"
hai
"
},
"
hai
"
} };
//
từ điển đăng nhiều kỳ
sợi dây
json =
JsonSerializer.Serialize(từ điển);
//
Giải mã hóa từ điển
Từ điển
sợi dây
> dictionary2 = JsonSerializer.Deserialize<>
sợi dây
>>(json);
。
Trong đoạn mã trên, chúng tôi xác định loại CustomType tùy chỉnh và sử dụng loại này làm loại Khóa của Từ điển.
Tiếp theo, chúng ta sử dụng phương thức JsonSerializer.Serialize để tuần tự hóa từ điển thành chuỗi JSON và phương thức JsonSerializer.Deserialize để giải tuần tự hóa chuỗi JSON thành một từ điển.
Tuy nhiên, trong đoạn code trên, chúng ta sẽ thấy rằng khi serialization từ điển, Key trong từ điển sẽ được serialize thành một đối tượng JSON thay vì chuỗi mà chúng ta mong muốn.
Tương tự, khi deserialize một chuỗi JSON, Key trong đối tượng JSON sẽ được deserialize thành đối tượng CustomType thay vì chuỗi mà chúng ta mong muốn.
Tại thời điểm này, chúng ta cần sử dụng trình chuyển đổi JSON tùy chỉnh để giải quyết vấn đề này.
ví dụ về mã
Đầu tiên, chúng tôi xác định loại CustomTypeConverter được kế thừa từ JsonConverter, loại này triển khai các phương thức Đọc, Viết, ReadAsPropertyName và WriteAsPropertyName:
công cộng
lớp học
CustomTypeConverter: JsonConverter
{
công cộng
ghi đè
Đọc CustomType(
tham khảo
Trình đọc Utf8JsonReader, Loại typeToConvert, tùy chọn JsonSerializerOptions) {
//
Hủy tuần tự hóa đối tượng
trở lại
JsonSerializer.Deserialize(
tham khảo
người đọc, tùy chọn); }
công cộng
ghi đè
vô hiệu
Write(Utf8JsonWriter writer, giá trị CustomType, tùy chọn JsonSerializerOptions) {
//
Đối tượng tuần tự hóa
JsonSerializer.Serialize(người viết, giá trị, tùy chọn); }
công cộng
ghi đè
Loại tùy chỉnh Đọc dưới dạng Tên Thuộc tính(
tham khảo
Trình đọc Utf8JsonReader, Loại typeToConvert, tùy chọn JsonSerializerOptions) {
//
Đọc khóa như chuỗi
của chúng tôi
chuỗiValue =
reader. GetString();
//
Phân tích chuỗi thành CustomType
trở lại
Phân tích cú pháp CustomType(stringValue); }
công cộng
ghi đè
vô hiệu
WriteAsPropertyName(Utf8JsonWriter writer, giá trị CustomType, tùy chọn JsonSerializerOptions) {
//
Viết khóa dưới dạng chuỗi
writer.WritePropertyName(giá trị.Khóa); }
riêng tư
Phân tích CustomType(
sợi dây
giá trị) {
//
Phân tích chuỗi thành CustomType
của chúng tôi
parts = giá trị.Split(
"
_
"
);
của chúng tôi
định danh =
số nguyên
.Parse(các phần[
0
]);
của chúng tôi
tên = các bộ phận[
1
];
trở lại
mới
Kiểu tùy chỉnh { Id
=
id, Tên
=
tên }; } }
。
Trong đoạn mã trên, chúng tôi sử dụng thuộc tính Key của loại CustomType làm Khóa của từ điển. Trong thao tác tuần tự hóa, thuộc tính Key được tuần tự hóa thành một chuỗi và trong thao tác deserialization, chuỗi được giải tuần tự hóa thành thuộc tính Key.
Tiếp theo, chúng tôi sử dụng trình chuyển đổi JSON tùy chỉnh này để tuần tự hóa và giải tuần tự hóa từ điển:
//
Xác định loại tùy chỉnh
công cộng
lớp học
Kiểu tùy chỉnh {
công cộng
số nguyên
Nhận dạng {
lấy
;
bộ
; }
công cộng
sợi dây
Tên {
lấy
;
bộ
; }
//
Lấy khóa được biểu thị bằng một chuỗi
công cộng
sợi dây
Chìa khóa => $
"
{Id}_{Tên}
"
; }
//
Xác định một đối tượng thuộc loại Từ điển
Từ điển
sợi dây
> từ điển =
mới
Từ điển
sợi dây
>
{ {
mới
Kiểu tùy chỉnh { Id =
1
, Tên =
"
một
"
},
"
một
"
}, {
mới
Kiểu tùy chỉnh { Id =
2
, Tên =
"
hai
"
},
"
hai
"
} };
//
Tạo đối tượng JsonSerializerOptions
của chúng tôi
tùy chọn =
mới
Tùy chọn JsonSerializer();
//
Thêm trình chuyển đổi JSON tùy chỉnh
tùy chọn. Bộ chuyển đổi. Thêm(
mới
Chuyển đổi loại tùy chỉnh());
//
từ điển đăng nhiều kỳ
sợi dây
jsonChuỗi =
JsonSerializer.Serialize(từ điển, tùy chọn);
//
Giải tuần tự hóa chuỗi JSON
của chúng tôi
kết quả = JsonSerializer.Deserialize<>
sợi dây
>>(jsonString, tùy chọn);
。
Trong đoạn mã trên, chúng tôi sử dụng thuộc tính Key của loại CustomType làm Khóa của từ điển. Trong thao tác tuần tự hóa, thuộc tính Key được tuần tự hóa thành một chuỗi và trong thao tác deserialization, chuỗi được giải tuần tự hóa thành thuộc tính Key.
Gợi ý sử dụng
Khi sử dụng System.Text.Json cho các hoạt động tuần tự hóa và giải tuần tự hóa, nếu muốn giải quyết vấn đề Khóa trong từ điển là loại tùy chỉnh, bạn có thể giải quyết bằng cách xác định trình chuyển đổi JSON tùy chỉnh.
Khi xác định trình chuyển đổi JSON tùy chỉnh, bạn cần chú ý đến các điểm sau:
- Loại cần kế thừa từ loại JsonConverter.
- Loại này cần triển khai các phương thức Đọc, Viết, ReadAsPropertyName và WriteAsPropertyName.
- Trong phương thức Read, chuỗi JSON cần được giải tuần tự hóa thành loại T.
- Trong phương thức Write, loại T cần được tuần tự hóa thành chuỗi JSON.
- Trong phương thức ReadAsPropertyName, chuỗi JSON cần được giải tuần tự hóa thành thuộc tính Key của từ điển.
- Trong phương thức WriteAsPropertyName, thuộc tính Key của từ điển cần được tuần tự hóa thành chuỗi JSON.
Tóm tắt
Thông qua một ví dụ, bài viết này giới thiệu cách sử dụng System.Text.Json để thực hiện các thao tác tuần tự hóa và giải tuần tự hóa nhằm giải quyết vấn đề Khóa trong từ điển là loại tùy chỉnh.
Khi xác định trình chuyển đổi JSON tùy chỉnh, bạn cần lưu ý rằng loại này cần kế thừa từ loại JsonConverter và triển khai các phương thức Read, Write, ReadAsPropertyName và WriteAsPropertyName.
Tài liệu tham khảo
- Hệ thống.Text.Json
- Cách tuần tự hóa và hủy tuần tự hóa một từ điển với kiểu khóa tùy chỉnh
Bài viết này được xây dựng bằng cách sử dụng tính năng phun nước hỗ trợ Chat OpenAI. Nếu có điểm tương đồng thì hoàn toàn có thể.
- Tác giả bài viết này: newbe36524
- Link bài viết này: https://www.newbe.pro/ChatAI/How-serialize-custom-type-as-dictionary-key-in-system-text-json/
- Tuyên bố về Bản quyền: Trừ khi có quy định khác, tất cả các bài viết trên blog này đều áp dụng BY-NC-SA Thỏa thuận cấp phép. Vui lòng ghi rõ nguồn khi tái bản!
Cuối cùng, bài viết này về cách xử lý vấn đề Key trong Từ điển là loại tùy chỉnh khi sử dụng System.Text.Json ở đây. Nếu bạn muốn biết thêm về cách xử lý vấn đề sử dụng Từ điển khi sử dụng System. Text.Json Đối với các câu hỏi có khóa là loại tùy chỉnh, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!