为什么ASPMVCCore将null传递给我的JsonConverter?

时间:2018-01-19 14:13:55

标签: c# asp.net-web-api asp.net-core

这是我的JSON请求对象

public class CategoryCreateOrUpdateCommand: IRequest<BaseApiStateResponse>
{
    public Guid? Id { get; set; }
    public string Name { get; set; }
}

我的控制器操作如下所示

    [HttpPost, Route("api/category-put")]
    public Task<BaseApiStateResponse> CreateOrUpdate([FromBody] CategoryCreateOrUpdateCommand command)
    {
        //Do stuff
    }

我有以下JsonConverter,它可以在Guid和Base64编码的字符串之间进行转换,以降低流量。

public class ShortGuidConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Guid) || objectType == typeof(Guid?);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (existingValue == null)
            return null;

        string base64Value = existingValue + "==";
        byte[] bytes = Convert.FromBase64String(base64Value);
        return new Guid(bytes);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Guid? guid = (Guid?)value;
        if (!guid.HasValue)
        {
            writer.WriteNull();
        } 
        else
        {
            string base64Value = Convert.ToBase64String(guid.Value.ToByteArray());
            base64Value = base64Value.Substring(0, base64Value.Length - 2);
            writer.WriteValue(base64Value);
        }
    }
}

这很好地序列化了传出的Guids,但是当从客户端收到请求时,传递到existingValue的{​​{1}}参数始终为null。

我错过了什么?注册如下:

ReadJson

1 个答案:

答案 0 :(得分:1)

解决方案是改为从reader.Value读取。