JSON.NET反序列化空GUID的正确格式是什么?

12

使用JSON.NET进行反序列化时,空GUID的正确格式是什么?

"{"id":"","name":"Test"}"导致出现"无法识别的GUID格式."

"{"id":null,"name":"Test"}"导致出现"值不能为空."

"{"id":"00000000-0000-0000-0000-000000000000","name":"Test"}"可以工作,但我不想强制客户端提供它。

1个回答

20

你提到的格式确实是“正确”的格式。但是,你也可以通过使用自定义的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);
    }
}

FYI,Resharper在Guid.Empty.Equals(value)上发出了“不纯方法…”警告。详见:https://dev59.com/Jmkw5IYBdhLWcg3wZJp9 - drzaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接