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

Ale*_*ler 9 guid json.net

使用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"}" 有效,但我不想强迫客户提供此功能.

car*_*ira 18

你提到的格式确实是"正确"的格式.但您也可以使用自定义支持其他格式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);
    }
}
Run Code Online (Sandbox Code Playgroud)