2012-04-08 81 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