모델이있는 간단한 ASP.NET Core WebApi가 있습니다.
public class Model
{
public bool? Value {get; set;}
}
및 끝점
[HttpPost]
public async Task<IActionResult> Create([FromBody] Model model)
본문으로 POST 요청을 할 때
{
"Value" : 7676
}
또는
{
"Value" : 2955454545645645645645645645654534534540
}
그때 model.Value == true
이것을 피하는 방법? 이 경우 7676
부울 값이 아니기 때문에 오류가 필요 합니다.
이 질문 과 this를 찾았 지만 다른 프로젝트에 많은 모델이 있기 때문에 솔루션이 적합하지 않습니다 (따라서 답변에서 모든 속성에 JsonConverter 속성을 추가하기가 어렵습니다)
또한이 동작을 설명하는 문서를 찾고 있습니다.
사용자 지정 JsonConverter를 만들어이를 달성 할 수 있습니다. 동일한 문서는 여기 에서 찾을 수 있습니다.
이 동작의 이유는 JSON.NET 또는 System.Text.JSON
형식을 deserialize 하는 방식과 관련이 있습니다. 123을 boolean
true 로 변환 할 수 있으므로 deserialization이 성공합니다. 읽고있는 토큰이 실제로 부울인지 확인하는 아래와 같이 JsonConverter를 명시 적으로 정의 할 때까지 정수 값에 따라 참 또는 거짓으로 간주합니다.
Newtonsoft를 사용하지 않는 경우. 당신은 사용하기System.Text.Json
이 페이지를 따를 수 있습니다 당신이 사용자 정의 JSON 컨버터를 만들
public class OnlyBoolean : JsonConverter
{
readonly JsonSerializer defaultSerializer = new JsonSerializer();
public override bool CanConvert(Type objectType)
{
return objectType == typeof(bool);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
switch (reader.TokenType)
{
case JsonToken.Boolean:
{
return defaultSerializer.Deserialize(reader, objectType);
}
case JsonToken.String:
{
if (reader.Value?.ToString() == "true" || reader.Value?.ToString() == "false")
return defaultSerializer.Deserialize(reader, objectType);
else
throw new JsonSerializationException(string.Format("Token \"{0}\" of type {1} is not a boolean type", reader.Value, reader.TokenType));
}
case JsonToken.Integer:
{
if (Convert.ToInt32(reader.Value) == 1 || Convert.ToInt32(reader.Value) == 0)
return defaultSerializer.Deserialize(reader, objectType);
else
throw new JsonSerializationException(string.Format("Token \"{0}\" of type {1} is not a boolean type", reader.Value, reader.TokenType));
}
default:
throw new JsonSerializationException(string.Format("Value\"{0}\" of type {1} is not a boolean type", reader.Value, reader.TokenType));
}
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
그런 다음 모델을 다음과 같이 장식합니다.
public class Model
{
[JsonConverter(typeof(OnlyBoolean))]
public bool? Value {get; set;}
}
또는 Startup에서 전역으로 등록하십시오.
services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new OnlyBoolean());});
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다