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"}}}}}
이렇게 평탄화 된 채로 잘 나온다.