2012-04-08 13 views
8

Serileştirme için JSON.NET kullanarak sunucuya gönderilecek boş GUID'lerin doğru biçimi nedir? "Value cannot be null."JSON.NET için boş GUID'lerin doğru formatı seri hale getirilsin mi?

"{"id":"00000000-0000-0000-0000-000000000000","name":"Test"}" çalışmalarında "Unrecognized Guid format."

"{"id":null,"name":"Test"}" sonuçlarında

"{"id":"","name":"Test"}" sonuç, ama bu sağlamak için müşterilerine zorlamak istemiyoruz.

cevap

16

Belirtilen biçim gerçekten "doğru" biridir. Ancak, diğer formatları özel bir JsonConverter kullanarak da destekleyebilirsiniz - örnek için aşağıdaki kodlara bakın.

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 Guid 'da (http://stackoverflow.com/questions/9927434/impure-method-is-called-for-readonly-field) [uyarı "... saf olmayan bir yöntem"], bir verir .Empty.Equals (değer) ' – drzaus

İlgili konular