首页 > 解决方案 > 将值“null”转换为类型“System.Nullable`1[System.Int64]”时出错

问题描述

我有一个 JSON 对象,其中包含一个nullas 字符串,这是无法避免的,当我将此对象发送到我的 API 时,我收到此错误消息

将值“null”转换为类型“System.Nullable`1[System.Int64]”时出错

我的示例 JSON

{ 
  Name:'Test',
  Id:'null'
}

我的模特/DTO

class Class1{
  public string Name {get;set;}
  public long? Id {get;set;}
}

标签: c#json

解决方案


您可以通过使用 aJsonConverter来处理将 a 解析stringlong?可以为 null 的逻辑来实现这一点。

使用 Newtonsoft.Json 的第一个示例

public class NewtonsoftStringToLongJsonConverter : Newtonsoft.Json.JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
    {
        var value = (string)reader.Value;
        if (string.Equals("null", value, StringComparison.InvariantCultureIgnoreCase))
        {
            return null;
        }

        if (!long.TryParse(value, out var parsedValue))
        {
            return null;
        }

        return parsedValue;
    }

    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

您的模型更新为

public class Class1
{
    public string Name { get; set; }

    [Newtonsoft.Json.JsonConverter(typeof(NewtonsoftStringToLongJsonConverter))]
    public long? Id { get; set; }
}

第二个选项使用 System.Text.Json 实现。

public class SystemTextStringToLongJsonConverter : System.Text.Json.Serialization.JsonConverter<long?>
{
    public override bool CanConvert(Type typeToConvert)
        => typeToConvert == typeof(long?);

    public override long? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var value = reader.GetString();
        if(string.Equals("null", value, StringComparison.InvariantCultureIgnoreCase))
        {
            return null;
        }

        if(!long.TryParse(value, out var parsedValue))
        {
            return null;
        }

        return parsedValue;
    }

    public override void Write(Utf8JsonWriter writer, long? value, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }
}

最后,您的模型更新为

public class Class1
{
    public string Name { get; set; }

    [Newtonsoft.Json.JsonConverter(typeof(NewtonsoftStringToLongJsonConverter))]
    public long? Id { get; set; }
}

推荐阅读