카테고리 없음

nlohmann JSON 사용법, ComfyUI Workflow 파일 읽기

GoingProdo 2026. 8. 27. 11:03

ComfyUI Workflow JSON을 C++ 프로그램에서 읽어야 한다면 nlohmann/json을 사용할 수 있다. 복잡한 JSON 처리 기능부터 익힐 필요 없이 파일을 열고 json::parse()로 읽은 뒤 nodes 배열에서 필요한 값을 꺼내는 흐름부터 이해하면 된다.

특히 ComfyUI workflow 분석기나 관리 도구를 C++로 만들려는 경우에는 모든 필드를 한꺼번에 처리할 필요가 없다. 이번 범위에서는 JSON 파일을 파싱하고 nodes 안의 id와 type을 읽는 과정까지만 보면 된다.

nlohmann json 사용법에서 가장 먼저 볼 변화

nlohmann/json에서는 먼저 JSON 파일을 파싱한다

nlohmann/json은 C++에서 JSON 데이터를 다룰 수 있도록 nlohmann::json 타입을 제공한다. 공식 예제에서는 <fstream>으로 파일 스트림을 만든 뒤 json::parse()에 전달해 JSON 객체로 읽는 방식을 사용할 수 있다.

기본 흐름은 workflow.json 파일을 std::ifstream으로 열고, 해당 스트림을 파싱해 하나의 json 객체로 만드는 것이다. 이 단계가 끝나면 파일에 들어 있던 JSON 구조를 C++ 코드에서 탐색할 수 있다.

include와 json 별칭부터 준비한다

사용할 때는 nlohmann/json.hpp 헤더를 포함하고 using json = nlohmann::json; 형태로 별칭을 지정하는 방식이 많이 쓰인다.

그다음 파일 스트림을 만들고 json::parse()를 호출하면 된다. nlohmann/json은 문자열뿐 아니라 std::istream 계열 입력도 파싱할 수 있기 때문에 JSON 파일을 별도의 문자열로 전부 변환할 필요는 없다.

ComfyUI Workflow JSON 역시 결국 JSON 문서이기 때문에 같은 방식으로 읽을 수 있다. 중요한 것은 파일을 읽은 뒤 ComfyUI workflow에서 필요한 최상위 필드를 찾아가는 것이다.

ComfyUI Workflow에서는 nodes를 먼저 찾는다

nlohmann json 사용법가 ComfyUI 워크플로우에 미치는 영향

ComfyUI Workflow JSON에는 workflow를 구성하는 노드들이 nodes 배열에 저장될 수 있다. C++에서 파일 파싱이 끝났다면 전체 JSON을 문자열처럼 검색하기보다 먼저 nodes를 기준으로 접근하는 편이 단순하다.

기존 방식과 비교해야 할 부분

nlohmann/json은 JSON object의 키를 이용해 내부 값에 접근할 수 있다. 따라서 workflow 객체에서 nodes를 가져온 뒤 배열의 각 요소를 순회하면 개별 node를 하나씩 검사할 수 있다.

각 node에서 id와 type을 읽는다

ComfyUI node에는 id, type 같은 값이 포함될 수 있다. nlohmann/json에서는 해당 key로 값에 접근한 뒤 get<T>()를 이용해 C++ 타입으로 명시적으로 변환할 수 있다.

예를 들어 id가 숫자라면 적절한 정수형으로 가져오고, type이 문자열이라면 std::string으로 변환하는 식이다. 이렇게 하면 "이 workflow에 어떤 노드가 들어 있는가"를 C++ 프로그램에서 목록으로 만들 수 있다.

이 단계에서는 links, widgets_values, 위치 정보까지 모두 처리할 필요가 없다. 먼저 nodes 배열을 순회할 수 있는지 확인한 다음 필요한 필드를 하나씩 추가하는 편이 디버깅하기 쉽다.

key와 값 타입을 확인한 뒤 접근한다

외부에서 받은 ComfyUI JSON을 처리한다면 모든 node에 자신이 원하는 key가 반드시 존재한다고 가정해서는 안 된다. JSON 구조나 노드 종류에 따라 가지고 있는 정보가 다를 수 있기 때문이다.

성능과 결과 품질에서 확인할 차이

따라서 실제 프로그램에서는 값을 읽기 전에 해당 key가 존재하는지 확인하는 처리가 필요하다. nlohmann/json은 object 내부에 특정 key가 존재하는지 확인할 수 있는 기능을 제공하므로, 무조건 값을 꺼내기보다 검증 후 접근하는 방식이 안전하다.

워크플로우 구성에서 놓치기 쉬운 부분

JSON의 값 타입도 함께 고려해야 한다. 예상했던 문자열 대신 다른 타입이 들어 있다면 getstd::string () 같은 변환에서 문제가 발생할 수 있기 때문이다.

특히 여러 사람이 만든 ComfyUI workflow를 자동으로 수집하거나 분석한다면 이런 검증 단계가 중요하다. 한 개의 고정 JSON만 대상으로 만들었던 코드는 구조가 다른 workflow를 만났을 때 쉽게 실패할 수 있다.

수정한 JSON은 dump로 다시 문자열화할 수 있다

nlohmann/json으로 읽은 데이터는 확인만 하는 데 그치지 않고 수정한 뒤 다시 JSON 형식으로 직렬화할 수도 있다. 이때 사용할 수 있는 대표적인 기능이 dump()다.

dump()는 JSON 객체를 문자열 표현으로 변환한다. 기본 호출은 압축된 형태로 출력하며, 들여쓰기 값을 지정하면 사람이 읽기 쉬운 형태로 출력할 수 있다.

dump와 값 가져오기는 역할이 다르다

get<T>()는 JSON 안의 특정 값을 C++ 타입으로 가져오는 데 사용한다. 반면 dump()는 JSON 값이나 객체 전체를 JSON 문자열 형태로 직렬화하는 기능이다.

실제로 적용할 때 체크할 점

ComfyUI workflow를 읽어서 노드 목록만 추출한다면 get<T>()가 중심이 된다. 반대로 JSON 내부를 수정한 뒤 새로운 workflow 파일로 다시 저장하려면 dump() 또는 출력 스트림을 사용하는 단계가 필요하다.

파싱 오류와 UTF-8도 확인한다

nlohmann/json의 parse()는 잘못된 JSON을 만나면 기본적으로 parse error 예외를 발생시킬 수 있다. 외부 workflow 파일을 자동 처리한다면 파일이 정상적인 JSON인지 검증하는 예외 처리를 추가하는 것이 좋다.

또한 일반적인 파일 입력에서 nlohmann/json은 UTF-8 JSON을 기준으로 처리한다. 프롬프트에 한글이나 다른 Unicode 문자가 포함된 workflow를 다룬다면 파일 인코딩도 함께 확인해야 한다.

처음부터 복잡한 오류 복구 로직을 만들 필요는 없다. 최소한 파일 열기 실패와 JSON parse 실패를 구분할 수 있게 만드는 것부터 시작하면 원인을 찾기 쉬워진다.

마지막 확인

nlohmann JSON으로 ComfyUI Workflow 파일을 읽는 기본 흐름은 단순하다. 파일을 std::ifstream으로 열고 json::parse()로 파싱한 뒤 nodes 배열을 순회하면서 필요한 id와 type을 가져오면 된다.

여기까지 정상적으로 동작한 다음 widgets_values나 links 처리를 추가하는 것이 좋다. ComfyUI JSON 분석 프로그램을 처음 만든다면 전체 workflow를 한 번에 해석하려 하지 말고 파일 파싱 → nodes 확인 → 필요한 key 추출 순서부터 구현하는 것이 가장 깔끔하다.