>source

이 기능이 작동하지 않는 이유:

[HttpGet("getCustomerAsDict")]
    public async Task<object> GetCustomersAsDict()
    {
        var customOutPut= new Dictionary<int, string>();
        var customer= await _context.Customers.ToListAsync();
        foreach (var custom in customer)
        {
            customOutPut[custom.CustomerId]= custom.CustomerName;
        }
        return customOutPut;
    }

우체부 던지기: System.NotSupportedException: 컬렉션 유형 'System.Collections.Generic.Dictionary`2[System.Int32,System.String]'은 지원되지 않습니다.

상태: 500 내부 서버 오류

하지만 이 기능은 작동합니다:

[HttpGet("getCustomerAsDict")]
    public async Task<object> GetCustomersAsDict()
    {
        var customOutPut= new Dictionary<string, int>();
        var customer= await _context.Customers.ToListAsync();
        foreach (var custom in customer)
        {
            customOutPut[custom.CustomerName]= custom.CustomerId;
        }
        return customOutPut;
    }

그리고 Postman은 내게 필요한 답변을 제공합니다.

방금 테스트했습니다. 모든 것이 제대로 작동합니다. 어떤 직렬 변환기를 사용하고 있습니까? 컨트롤러 구성으로 API 시작을 보여줄 수 있습니까?

Serge2022-01-16 23:18:27

IMO int->string 매핑은 사전/객체에 문자열 키/식별자가 있어야 하므로 잘못된 JSON을 만듭니다.

orhtej22022-01-16 23:30:09

반면에 엔드포인트가 JSON을 반환할 확실한 증거가 없습니다.

orhtej22022-01-16 23:31:32
  • 답변 # 1

    방금 var customOutPut= new Dictionary<정수, 문자열> () 사전 및 Posman이 결과를 반환했습니다.

    {
        "1": "cust1",
        "2": "cust2"
    }
    

    내 컨트롤러는 Newtonsoft.Json을 사용하도록 구성되었으며 유효한 json을 생성하기 위해 자동으로 int를 string으로 변환합니다.

    하지만 이 json은 유효하지 않습니다

    {
        1: "cust1",
        2: "cust2"
    }
    

    이것이 예외가 발생한 이유입니다. 몇 가지 조사를 한 결과 System.Text.Json: 'System.Collections.Generic.Dictionary[System.Int32,System.String]이 지원되지 않는 컬렉션 유형이 넷 코어 3.1-5.0에서 공통적이라는 것을 발견했습니다. 그러나 net 6에서는 이미 수정된 것 같습니다. 이전 버전을 사용하는 경우 Text.Json이 해결 방법으로 사용자 정의 DictionaryConverter를 만드는 것이 좋습니다.

    하지만 사전 값을 얻으려고 하면 json이 아니기 때문에 여전히 유효합니다.

    var val=  customOutPut[1]; //cust1
    

  • 이전 SQL Server Management Studio 2012의 기본 키 자동 증가
  • 다음 c# : EF Core의 손자 속성으로 상위 컬렉션 필터링