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



我有一个JSON对象,其中包含一个字符串null,这是无法避免的,当我将此对象发送到我的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;}
}

可以通过使用JsonConverter来处理将string解析为可为 null 的long?的逻辑来实现此目的。

第一个使用 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; }
}

获取 json 字符串。string.Replace("'null'", "null")然后将其映射到您的dto

相关内容

  • 没有找到相关文章

最新更新