2012-04-08 82 views
8

使用JSON.NET進行反序列化時,將空的GUID發送到服務器的正確格式是什麼?什麼是JSON.NET反序列化的空GUID的正確格式?

"{"id":"","name":"Test"}"結果"Unrecognized Guid format."

"{"id":null,"name":"Test"}"結果"Value cannot be null."

"{"id":"00000000-0000-0000-0000-000000000000","name":"Test"}"的作品,但我不希望強制客戶提供這一點。

回答

16

您提到的格式確實是「正確的」格式。但您也可以使用自定義JsonConverter來支持其他格式 - 請參閱下面的代碼以獲取示例。

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給出[ 「不純的方法...」 的警告(http://stackoverflow.com/questions/9927434/impure-method-is-called-for-readonly-field) .Empty.Equals(值)' – drzaus 2015-02-26 22:25:26