부울 속성에 숫자를 바인딩하지 마십시오

나는 TChebur입니다

모델이있는 간단한 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을 booleantrue 로 변환 할 수 있으므로 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Srping Boot 2.x를 사용하여 Json에서 변환 유형 부울을 작동하지 마십시오.

분류에서Dev

checkBox를 부울 속성에 바인딩하는 방법은 무엇입니까?

분류에서Dev

종속성 상속에만 부모를 사용하십시오.

분류에서Dev

자바 키 바인딩-Windows에서 AltGr의 CTRL을 잡지 마십시오.

분류에서Dev

이 부모 개체를 자바 스크립트의 자식 개체에 바인딩하십시오.

분류에서Dev

APK를 생성하지 마십시오

분류에서Dev

자바에서 난수를 반복하지 마십시오.

분류에서Dev

DataGridview에 자식이 없으면 부모 DataTable을 표시하지 마십시오.

분류에서Dev

두 숫자 값이 numpy (+/-)에서 동일한 부호를 가지고 있는지 확인하십시오.

분류에서Dev

숫자로 시작하는 열 값에 부울 값 할당

분류에서Dev

Pandas 시리즈의 숫자를 부울로 바꾸기

분류에서Dev

python-pandas에서 부울 연산자를 통해 숫자 인덱스 가져 오기

분류에서Dev

마지막 전에 메시지를 확인하십시오.

분류에서Dev

부모에게 호버 효과를 적용하지 마십시오.

분류에서Dev

보기의 POST 부분에서 GET 논리를 다시 작성하지 마십시오.

분류에서Dev

문자로 묶인 부분 문자열에 정규식을 사용하지 마십시오.

분류에서Dev

선택한 부모에서 자식 노드를 제거하지만 손녀는 제거하지 마십시오.

분류에서Dev

기본 생성자를 두 번 호출하지 마십시오.

분류에서Dev

지시어 범위 부울 속성

분류에서Dev

SQL에서 슬래시 마크 앞뒤에 가장 낮은 숫자를 추출하십시오.

분류에서Dev

Material Table에서 삭제를 확인하지 마십시오.

분류에서Dev

부울에 대한 각도 바인딩 라디오가 작동하지 않습니다.

분류에서Dev

메시지에 연락처를 표시하지 마십시오

분류에서Dev

PartialView에서 자바 스크립트 함수를 실행하지 마십시오.

분류에서Dev

WPF-데이터 테이블에 데이터 그리드 바인딩, 자동 생성 된 열, 부울이 선택 됨으로 표시되지 않음

분류에서Dev

함수를 호출하여 파일 시작 부분에 텍스트를 추가하지 마십시오.

분류에서Dev

부모에서 자식 구성 요소로의 AngularJS 속성 바인딩이 작동하지 않습니다.

분류에서Dev

jQuery를 사용하여 maxlength 속성을 우회하지 마십시오.

분류에서Dev

WPF 부모 그리드 패널의 속성에 대한 바인딩이 실패하지만 바인딩 경고 메시지가 표시되지 않습니다.

Related 관련 기사

  1. 1

    Srping Boot 2.x를 사용하여 Json에서 변환 유형 부울을 작동하지 마십시오.

  2. 2

    checkBox를 부울 속성에 바인딩하는 방법은 무엇입니까?

  3. 3

    종속성 상속에만 부모를 사용하십시오.

  4. 4

    자바 키 바인딩-Windows에서 AltGr의 CTRL을 잡지 마십시오.

  5. 5

    이 부모 개체를 자바 스크립트의 자식 개체에 바인딩하십시오.

  6. 6

    APK를 생성하지 마십시오

  7. 7

    자바에서 난수를 반복하지 마십시오.

  8. 8

    DataGridview에 자식이 없으면 부모 DataTable을 표시하지 마십시오.

  9. 9

    두 숫자 값이 numpy (+/-)에서 동일한 부호를 가지고 있는지 확인하십시오.

  10. 10

    숫자로 시작하는 열 값에 부울 값 할당

  11. 11

    Pandas 시리즈의 숫자를 부울로 바꾸기

  12. 12

    python-pandas에서 부울 연산자를 통해 숫자 인덱스 가져 오기

  13. 13

    마지막 전에 메시지를 확인하십시오.

  14. 14

    부모에게 호버 효과를 적용하지 마십시오.

  15. 15

    보기의 POST 부분에서 GET 논리를 다시 작성하지 마십시오.

  16. 16

    문자로 묶인 부분 문자열에 정규식을 사용하지 마십시오.

  17. 17

    선택한 부모에서 자식 노드를 제거하지만 손녀는 제거하지 마십시오.

  18. 18

    기본 생성자를 두 번 호출하지 마십시오.

  19. 19

    지시어 범위 부울 속성

  20. 20

    SQL에서 슬래시 마크 앞뒤에 가장 낮은 숫자를 추출하십시오.

  21. 21

    Material Table에서 삭제를 확인하지 마십시오.

  22. 22

    부울에 대한 각도 바인딩 라디오가 작동하지 않습니다.

  23. 23

    메시지에 연락처를 표시하지 마십시오

  24. 24

    PartialView에서 자바 스크립트 함수를 실행하지 마십시오.

  25. 25

    WPF-데이터 테이블에 데이터 그리드 바인딩, 자동 생성 된 열, 부울이 선택 됨으로 표시되지 않음

  26. 26

    함수를 호출하여 파일 시작 부분에 텍스트를 추가하지 마십시오.

  27. 27

    부모에서 자식 구성 요소로의 AngularJS 속성 바인딩이 작동하지 않습니다.

  28. 28

    jQuery를 사용하여 maxlength 속성을 우회하지 마십시오.

  29. 29

    WPF 부모 그리드 패널의 속성에 대한 바인딩이 실패하지만 바인딩 경고 메시지가 표시되지 않습니다.

뜨겁다태그

보관