2012-06-29 38 views
27

Json.NET liệt kê "deserialization thuộc tính phân biệt chữ hoa chữ thường" là một trong những tính năng được quảng cáo. Tôi đã đọc rằng một nỗ lực đầu tiên sẽ được thực hiện để phù hợp với trường hợp của tài sản được chỉ định và nếu một trận đấu không được tìm thấy một tìm kiếm phân biệt chữ hoa chữ thường được thực hiện. Tuy nhiên, điều này có vẻ không phải là hành vi mặc định. Xem ví dụ sau:Json.NET Không phân biệt thuộc tính không phân biệt chữ hoa chữ thường

var result = 
    JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
     "{key: 123, value: \"test value\"}" 
    ); 

// result is equal to: default(KeyValuePair<int, string>) 

Nếu chuỗi JSON được thay đổi để phù hợp với trường hợp của các thuộc tính ("Key" và "Giá trị" vs "chìa khóa" và "giá trị"), sau đó tất cả là tốt:

var result = 
    JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
     "{Key: 123, Value: \"test value\"}" 
    ); 

// result is equal to: new KeyValuePair<int, string>(123, "test value") 

Có cách nào để thực hiện cho quá trình deserialization phân biệt chữ hoa chữ thường không?

Trả lời

23

Đó là lỗi.

Không phân biệt thuộc tính không phân biệt chữ hoa chữ thường đề cập đến Json.NET có thể ánh xạ thuộc tính JSON với tên "Khóa" tới thành viên "Khóa" hoặc "khóa" của lớp .NET.

Lỗi là KeyValuePair yêu cầu JsonConverter riêng của nó nhưng bỏ lỡ bản đồ không phân biệt chữ hoa chữ thường.

https://github.com/JamesNK/Newtonsoft.Json/blob/fe200fbaeb5bad3852812db1e964473e1f881d93/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs

Sử dụng đó như là một cơ sở và thêm chữ "chìa khóa" và "giá trị" để báo cáo trường hợp khi đọc JSON.

+1

Cảm ơn đã giải thích và sửa chữa. Tôi đã không biết rằng một Converter đã được sử dụng cho KeyValuePair. –

7

Một cách hiệu quả mà tôi thấy là sử dụng GetValue với tham số StringComparer.

Vì vậy, ví dụ,

JObject contact; 
String strName = contact.GetValue('Name'); 

Bạn đang cố gắng truy cập vào bất động sản 'Tên' như trường hợp nhạy cảm, bạn có thể sử dụng

JObject contact; 
String strName = contact.GetValue("ObjType", StringComparison.InvariantCultureIgnoreCase); 
Các vấn đề liên quan