使用JSON.NET进行反序列化时,空GUID的正确格式是什么?
"{"id":"","name":"Test"}"
导致出现"无法识别的GUID格式."
"{"id":null,"name":"Test"}"
导致出现"值不能为空."
"{"id":"00000000-0000-0000-0000-000000000000","name":"Test"}"
可以工作,但我不想强制客户端提供它。
你提到的格式确实是“正确”的格式。但是,你也可以通过使用自定义的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);
}
}
Guid.Empty.Equals(value)
上发出了“不纯方法…”警告。详见:https://dev59.com/Jmkw5IYBdhLWcg3wZJp9 - drzaus