2012-04-08 29 views
8

Định dạng đúng cho GUID trống sẽ được gửi đến máy chủ bằng cách sử dụng JSON.NET cho deserialization là gì?Định dạng đúng cho GUID trống cho JSON.NET được deserialized là gì?

"{"id":"","name":"Test"}" kết quả trong "Unrecognized Guid format."

"{"id":null,"name":"Test"}" kết quả trong "Value cannot be null."

"{"id":"00000000-0000-0000-0000-000000000000","name":"Test"}" công trình, nhưng tôi không muốn để buộc khách hàng để cung cấp này.

Trả lời

16

Định dạng bạn đã đề cập thực sự là định dạng "chính xác". Nhưng bạn cũng có thể hỗ trợ các định dạng khác bằng cách sử dụng tùy chỉnh JsonConverter - xem mã bên dưới để biết ví dụ.

public class StackOverflow_10063118 
{ 
    public class Foo 
    { 
     public Guid guid; 
     public int i; 

     public override string ToString() 
     { 
      return string.Format("Foo[i={0},guid={1}]", i, guid); 
     } 
    } 
    class GuidConverter : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      return typeof(Guid) == objectType; 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      switch (reader.TokenType) 
      { 
       case JsonToken.Null: 
        return Guid.Empty; 
       case JsonToken.String: 
        string str = reader.Value as string; 
        if (string.IsNullOrEmpty(str)) 
        { 
         return Guid.Empty; 
        } 
        else 
        { 
         return new Guid(str); 
        } 
       default: 
        throw new ArgumentException("Invalid token type"); 
      } 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      if (Guid.Empty.Equals(value)) 
      { 
       writer.WriteValue(""); 
      } 
      else 
      { 
       writer.WriteValue((Guid)value); 
      } 
     } 
    } 
    public static void Test() 
    { 
     Foo foo = new Foo { guid = Guid.Empty, i = 123 }; 
     JsonSerializer js = new JsonSerializer(); 
     js.Converters.Add(new GuidConverter()); 
     StringBuilder sb = new StringBuilder(); 
     StringWriter sw = new StringWriter(sb); 
     js.Serialize(sw, foo); 
     Console.WriteLine(sb.ToString()); 
     StringReader sr = new StringReader(sb.ToString()); 
     Foo foo2 = js.Deserialize(sr, typeof(Foo)) as Foo; 
     Console.WriteLine(foo2); 
    } 
} 
+0

FYI Resharper cho một [ "phương pháp bất tịnh ..." cảnh báo] (http://stackoverflow.com/questions/9927434/impure-method-is-called-for-readonly-field) trên 'Guid .Empty.Equals (giá trị) ' – drzaus

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