Go에서 JSON 평탄화 하기

박재훈·2025년 4월 8일
0

GO

목록 보기
24/24

indent 설정되어 있는 JSON을 LLM에 넣는 등의 이유로 indent를 제거해서 평탄화를 하고 싶을 때가 있다.
Go에서 JSON 평탄화 하려면 json.RawMessage 타입으로 캐스팅 한 뒤 Marshal 하면 된다.

예시 JSON은 https://json.org/example.html에서 가져왔다.

# example.json
{
    "glossary": {
        "title": "example glossary",
		"GlossDiv": {
            "title": "S",
			"GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
					"SortAs": "SGML",
					"GlossTerm": "Standard Generalized Markup Language",
					"Acronym": "SGML",
					"Abbrev": "ISO 8879:1986",
					"GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
						"GlossSeeAlso": ["GML", "XML"]
                    },
					"GlossSee": "markup"
                }
            }
        }
    }
}

위 JSON을 example.json이라는 파일로 일단 저장해서 불러왔다.

f, err := os.OpenFile("example.json", os.O_RDONLY, 0644)
if err != nil {
	log.Fatal(err)
}
defer f.Close()

var buf bytes.Buffer
if _, err := buf.ReadFrom(f); err != nil {
	log.Fatal(err)
}

s := buf.String()
fmt.Println(s)

이렇게 출력하면 당연히 indent 설정된 원본 JSON이 출력된다.
그래서 이걸 앞서 설명한대로 json.RawMessage로 감싼 뒤 Marshal 하면 된다.

raw := json.RawMessage(s)
flatten, err := json.Marshal(raw)
if err != nil {
	log.Fatal(err)
}

fmt.Println(string(flatten))

그러면

{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}

이렇게 평탄화 된 채로 잘 나온다.

profile
생각대로 되지 않을 때, 비로소 코딩은 재미있는 법.

0개의 댓글

관련 채용 정보