DBA

ASP.NET Web API에서 JObject와 JArray를 함께 사용하는 고급 JSON 처리법 + DTO 변환까지 본문

[3] Development/MVC(ASP.NET with C#)

ASP.NET Web API에서 JObject와 JArray를 함께 사용하는 고급 JSON 처리법 + DTO 변환까지

코볼 2025. 4. 4. 15:24
728x90
반응형
SMALL

JObject와 JArray를 활용한 ASP.NET Web API JSON 고급 처리

  • JArray란 무엇인가요?
  • 복합 JSON 구조 예제 – JObject + JArray
  • 실전 코드 예제 – 설정 값과 배열 함께 받기
  • JObject를 DTO로 변환하는 방법
  • 마무리 및 사용 시 유의사항

 

ASP.NET Web API에서는 단일 JSON 객체를 받을 때 [FromBody] JObject를 활용할 수 있습니다.
그런데 요청 데이터가 다음과 같이 객체 + 배열 구조로 복합적이라면 어떻게 처리해야 할까요?

json

{
  "settings": {
    "theme": "dark",
    "language": "ko"
  },
  "items": [
    { "id": 1, "name": "apple" },
    { "id": 2, "name": "banana" }
  ]
}

 

이 글에서는 위와 같은 구조를 처리하기 위해 JObject와 JArray를 조합하여 다루는 방법과, 받은 JObject를 DTO 객체로 변환하는 팁까지 소개합니다.

 

🔹 JArray란?

JArray는 Newtonsoft.Json에서 제공하는 JSON 배열을 표현하는 객체입니다.
일반적인 List<object> 같은 개념이며, JObject와 조합해 계층형 구조도 표현할 수 있습니다.

csharp

JArray items = (JArray)jObject["items"];

 

🔸 복합 JSON 구조 예제

요청 JSON:

json

{
  "settings": {
    "theme": "dark",
    "language": "ko"
  },
  "items": [
    { "id": 1, "name": "apple" },
    { "id": 2, "name": "banana" }
  ]
}

컨트롤러 메서드:

csharp

[HttpPost]
public IHttpActionResult SaveData([FromBody] JObject data)
{
    // settings 추출
    JObject settings = data.Value<JObject>("settings");
    string theme = settings.Value<string>("theme");
    string language = settings.Value<string>("language");

    // items 배열 추출
    JArray items = data.Value<JArray>("items");
    List<string> itemNames = new List<string>();

    foreach (JObject item in items)
    {
        string name = item.Value<string>("name");
        itemNames.Add(name);
    }

    return Ok(new
    {
        Theme = theme,
        Language = language,
        Items = itemNames
    });
}

 

 

🔸 JObject → DTO(모델 클래스)로 변환하는 방법

 

모델 클래스 정의:

csharp

public class SettingModel
{
    public string Theme { get; set; }
    public string Language { get; set; }
}

public class ItemModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class CompositeModel
{
    public SettingModel Settings { get; set; }
    public List<ItemModel> Items { get; set; }
}

 

 

JObject를 DTO로 변환:

csharp

[HttpPost]
public IHttpActionResult SaveComposite([FromBody] JObject data)
{
    var model = data.ToObject<CompositeModel>();

    // model.Settings.Theme, model.Items.Count 등 활용 가능
    return Ok(new
    {
        Message = "변환 성공",
        Theme = model.Settings.Theme,
        FirstItem = model.Items[0].Name
    });
}

 

✔ ToObject<T>()는 Json.NET에서 지원하는 매우 강력한 기능으로, 동적 JSON을 DTO에 자동으로 맵핑해줍니다.

 

 

✅ 언제 이렇게 쓸까?

상황 추천 방식
데이터 구조가 복잡하고 유동적일 때 JObject, JArray 직접 다루기
구조가 정해져 있고 타입 안정성이 필요할 때 DTO 변환 (ToObject<T>())
구조 일부만 파싱하고 싶을 때 JObject에서 필요한 부분만 추출

 

 

 

⚠️ 사용 시 유의사항

 

  • DTO 변환 시, JSON 구조와 DTO 속성명이 정확히 일치해야 함
  • JArray는 인덱스로도 접근 가능하지만 foreach를 더 안전하게 사용
  • 너무 복잡한 JObject 처리는 오히려 디버깅을 어렵게 만들 수 있음 → 가능한 DTO 활용 권장

 

 

 

✅ 결론

ASP.NET Web API에서 JObject와 JArray를 조합하면, 구조가 복잡하거나 예측 불가능한 JSON 데이터를 유연하게 처리할 수 있습니다.
또한 필요에 따라 ToObject<T>() 메서드를 통해 정적 타입으로의 변환도 가능하므로, 다양한 방식으로 JSON 데이터를 다룰 수 있는 여지가 넓습니다.

이 기능들을 적절히 활용하면, 동적 데이터 처리와 정형 데이터 처리의 균형을 잘 유지할 수 있습니다.

 

 

📌 이 글이 도움이 되셨다면 댓글과 공유 부탁드립니다.
추가로 “JsonConverter를 사용한 커스텀 파싱” 편도 준비 중입니다. 기대해주세요 😊

 

728x90
반응형
LIST