2015-07-31 15 views
6

Tôi đang deserializing một đối tượng sử dụng Json.NET có chứa một trường tư nhân của loại Guid và một tài sản công cho lĩnh vực đó. Khi giá trị cho Guid của tôi là null trong json của tôi, tôi muốn gán Guid.Empty cho trường của tôi.Json.net deserialization null guid case

public class MyClass 
{ 
    private Guid property; 
    public Guid Property 
    { 
     get { return property; } 
     set 
     { 
      if (value == null) 
      { 
       property = Guid.Empty; 
      } 
      else 
      { 
       property = value; 
      } 
     } 
    } 
} 

Nhưng deserializer muốn truy cập các lĩnh vực tư nhân, vì tôi nhận được lỗi này khi tôi cố gắng deserialize:

Lỗi chuyển đổi giá trị {rỗng} để gõ 'System.Guid'. Đường dẫn '[0] .property', dòng 6, vị trí 26.

Làm cách nào để bỏ qua trường riêng tư và sử dụng tài sản công cộng?

Trả lời

8

Json.NET từ chối đặt giá trị null cho Guid vì đây là loại giá trị không thể vô hiệu. Hãy thử nhập (Guid)null vào số Immediate Window và bạn sẽ thấy thông báo lỗi cho biết rằng chuyển đổi này không thể thực hiện được trong .Net.

Để làm việc xung quanh này, bạn có một vài lựa chọn:

  1. Tạo một Guid? sở hữu ủy quyền nullable. Nó có thể tin nếu bạn muốn miễn là nó có một thuộc tính [JsonProperty]:

    public class MyClass 
    { 
        [JsonIgnore] 
        public Guid Property { get; set; } 
    
        [JsonProperty("Property")] 
        Guid? NullableProperty { get { return Property == Guid.Empty ? null : (Guid?)Property; } set { Property = (value == null ? Guid.Empty : value.Value); } } 
    } 
    
  2. Tạo một JsonConverter có thể chuyển đổi một null Json thẻ đến một giá trị mặc định Guid:

    public class MyClass 
    { 
        [JsonConverter(typeof(NullToDefaultConverter<Guid>))] 
        public Guid Property { get; set; } 
    } 
    
    public class NullToDefaultConverter<T> : JsonConverter where T : struct 
    { 
        public override bool CanConvert(Type objectType) 
        { 
         return objectType == typeof(T); 
        } 
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
        { 
         var token = JToken.Load(reader); 
         if (token == null || token.Type == JTokenType.Null) 
          return default(T); 
         return token.ToObject(objectType); 
        } 
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
        { 
         if (EqualityComparer<T>.Default.Equals((T)value, default(T))) 
          writer.WriteNull(); 
         else 
          writer.WriteValue(value); 
        } 
    } 
    
+0

Cảm ơn bạn ! Một câu hỏi về Null để chuyển đổi mặc định. Tôi có phải tự thêm thuộc tính JsonConverter vào mỗi trường/thuộc tính trong lớp của tôi hay bằng cách nào đó tôi có thể thêm nó vào tất cả các thuộc tính trong lớp? – Adrian

+1

Bạn có thể thêm nó vào mỗi thuộc tính hoặc đăng ký nó để sử dụng trên toàn cầu trong tất cả các lớp. Xem [Đăng ký một JsonConverter tùy chỉnh trong Json.Net] (http://stackoverflow.com/questions/19510532/registering-a-custom-jsonconverter-in-json-net). – dbc

Các vấn đề liên quan