개발노트

10. [ASP .NET Core] Json으로 객체 직렬화 시, 빈 값으로 매핑되는 문제 본문

서버 개발/ASP .NET Core

10. [ASP .NET Core] Json으로 객체 직렬화 시, 빈 값으로 매핑되는 문제

mroh1226 2025. 3. 25. 21:21
반응형
  • 문제: DB로부터 결과 값은 다 잘받아오는데 결과 값이 직렬화가 안되는 문제
  • 삽질 기간: 하루
  • 해결: 객체 속성을 public으로 선언하여 해결

발견 디버깅 구간

var resultData = personData.SelectAddress(addressID);		//잘나옴
response.Body = JsonConvert.SerializeObject(resultData);	//{[]} 빈값으로 직렬화됨

 
원인은 결과로 받은 BusinessEntityAddress 객체 속성에 public을 안붙여서...였다.
 

해결 전
    [Table("Person.BusinessEntityAddress")]
    public class BusinessEntityAddress
    {
        [Column("BusinessEntityID")]
        int BusinessEntityID { get; set; }
        [Column("AddressID")]
        int AddressID { get; set; }
        [Column("AddressTypeID")]
        int AddressTypeID { get; set; }
    }

 

해결 후
  [Table("Person.BusinessEntityAddress")]
  public class BusinessEntityAddress
  {
      [Column("BusinessEntityID")]
      public int BusinessEntityID { get; set; }
      [Column("AddressID")]
      public int AddressID { get; set; }
      [Column("AddressTypeID")]
      public int AddressTypeID { get; set; }
  }

 
꼭 확인하고 객체생성할 때 속성에도 public을 붙여야 JsonConvert.DeserializeObject 로 직렬화가 된다.

왜 그런 걸까?

(public의 역할)Newtonsoft.Json (Json.NET)의 기본 동작은 **공개 속성(public properties)**만 직렬화 대상으로 인식합니다. 이유는 다음과 같습니다:

(1) 기본 직렬화 규칙Json.NET은 객체를 JSON으로 변환할 때, public으로 선언된 속성의 getter를 기준으로 데이터를 가져옵니다.

public이 없는 속성(즉, 접근 제어자가 생략된 경우)은 기본적으로 internal로 간주되며, 직렬화에서 제외됩니다.예:

public class Address
{
    int AddressID { get; set; } // internal (기본값)
    public string AddressLine1 { get; set; } // public
}
var address = new Address { AddressID = 1, AddressLine1 = "123 Main St" };
string json = JsonConvert.SerializeObject(address);
// 결과: {"AddressLine1": "123 Main St"} (AddressID는 제외됨)

(2) C#의 접근 제어자 기본값C#에서 클래스 내부의 멤버(속성, 필드 등)에 접근 제어자를 명시하지 않으면 기본적으로 private 또는 internal로 설정됩니다:

클래스 멤버는 private가 기본.하지만 속성({ get; set; })은 클래스 내부에서만 사용되도록 설계된 경우 internal처럼 동작할 수 있음.Json.NET은 private나 internal 속성을 기본적으로 무시하므로, 직렬화되지 않음.
 
잘하자

반응형
Comments