2015-06-22 16 views
12

Tôi đang sử dụng Json.Net để tuần tự hóa và deserialize lớp học để json và trở lại.Bỏ qua một thuộc tính khi deserializing bằng cách sử dụng Json.Net với ItemRequired = Required.Always

Tôi đã thêm vào một lớp được đánh dấu bằng [JsonObject(ItemRequired = Required.Always)] (hoặc Required.Always) thuộc tính chỉ nhận mới. Điều đó dẫn tới những điều sau JsonSerializationException:

Newtonsoft.Json.JsonSerializationException: tài sản '<PropertyName>' bắt buộc chưa được tìm thấy trong JSON

Tôi nghĩ đánh dấu rằng tài sản với JsonIgnore sẽ giải quyết vấn đề này, nhưng điều đó không làm việc .

Làm cách nào tôi có thể thông báo cho Json.Net rằng thuộc tính này sẽ bị bỏ qua?

Dưới đây là một ví dụ rất nhỏ tái tạo vấn đề:

[JsonObject(ItemRequired = Required.Always)] 
public class Hamster 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    [JsonIgnore] 
    public string FullName { get { return FirstName + LastName; }} 
} 

private static void Main() 
{ 
    var hamster = new Hamster {FirstName = "Bar", LastName = "Arnon"}; 
    var serializeObject = JsonConvert.SerializeObject(hamster); 
    var deserializeObject = JsonConvert.DeserializeObject<Hamster>(serializeObject); 
} 

Trả lời

19

Rõ ràng JsonIgnore sẽ chỉ kiểm soát serialization trong trường hợp này. Yêu cầu JsonIgnore để chỉ định rằng thuộc tính FullName không được đăng theo thứ tự đại diện json.

Để bỏ qua thuộc tính trong quá trình deserialization, chúng tôi cần thêm chú thích JsonProperty với Required = Required.Default (có nghĩa là không bắt buộc).

Vì vậy, đây là cách để tránh những JsonSerializationException:

[JsonObject(ItemRequired = Required.Always)] 
public class Hamster 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    [JsonIgnore] 
    [JsonProperty(Required = Required.Default)] 
    public string FullName { get { return FirstName + LastName; }} 
} 
Các vấn đề liên quan