일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- page
- MSSQL
- MVVM
- Binding
- spring boot
- db
- AnimationController
- GitHub
- Animation
- 리엑트
- 함수
- React JS
- HTML
- Firebase
- JavaScript
- MS-SQL
- 오류
- Maui
- 닷넷
- 자바스크립트
- .NET
- 애니메이션
- 플러터
- 마우이
- Flutter
- 바인딩
- typescript
- 깃허브
- 파이어베이스
- listview
- Today
- Total
개발노트
10. [ASP .NET Core] Json으로 객체 직렬화 시, 빈 값으로 매핑되는 문제 본문
- 문제: 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 속성을 기본적으로 무시하므로, 직렬화되지 않음.
잘하자
'서버 개발 > ASP .NET Core' 카테고리의 다른 글
12. [ASP .NET Core] TcpClient (Winform 으로 클라 만들기) (0) | 2025.03.28 |
---|---|
11. [ASP .NET Core] TCP Server 만들기 (백그라운드 서비스, DI로 자동 주입) (0) | 2025.03.28 |
9. [ASP .NET Core] 닷넷에서 웹 파일로 띄우기 (0) | 2025.03.25 |
8. [ASP .NET Core] 누겟말고 소스 (0) | 2025.02.19 |
7. [ASP .NET Core] HttpClient 올바르게 사용하기 (0) | 2025.02.03 |