我有一个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