Web/GoLang

[golang] json 파싱시 개행으로 인한 파싱오류, 문자열 강제 replace

벨포트조던 2021. 11. 15.
반응형

배경 

- 클라이언트쪽에서 잘못된 json 을 보냄. 클라쪽에서 변경이 여의치 않아 api  단에서 강제 replcae 해야줘야 함 

- java는 이런 내용은 string으로 대부분 처리하면 되는데.. 

golang은 byte 배열, string 이 각각있어서, 처리하는게 두가지 방법임 .. 

 

잘못된 json 예시 

`{"aaa":"01049447019","bbb":"안녕하세요.  입니다.
아래 링크.
 설정 완료 후  이용해주세요."}`

한줄로 보내지 않고 '입니다.' 뒤에 엔터(개행)이 들어감 

 

이 경우 언어에따라서 자동파싱되는게 있고, 안되는게 있는듯 ( 닷넷은 자동으로 보정하는 듯하다 ) 

golang은 자동 파싱이 되지 않아서... 에러가 발생. 그래서 강제 변환이 필요 

 

https://play.golang.org/

go 웹테스트 사이트 

 

검색해서 찾은 방법은 

https://www.programming-books.io/essential/go/normalize-newlines-1d3abcf6f17c4186bb9617fa14074e48#9cdc1dd8-9059-4c15-b588-94a737968c8d

이거다... 

 

이게 정확한 방법인주 알았는데, 되지 않았다 .

 

위방식대로 한다면 

\r\n , \r --> \n 으로 변경하는건데 이 경우 다른 문제가 또 발생함

{ // 여기서 엔터가 발생
	"param" : "111",
    "param2 : "222"
}

위 주석처럼 의도치않은 엔터를 변경시킴, 이러면 더 문제가 되버린다

 

그래서 최종 아래 버전으로 바꿈 

 

// NormalizeNewlines normalizes \r\n (windows) and \r (mac)
// into \n (unix)
func NormalizeNewlines(d []byte) []byte {
	// 변경내용
	// replace CR LF \r\n (windows) with LF \n (unix)
	d = bytes.Replace(d, []byte{13, 10}, []byte{}, -1)
	// replace CF \r (mac) with LF \n (unix)
	d = bytes.Replace(d, []byte{13}, []byte{}, -1)
    
    // 추가 코드
    d = bytes.Replace(d, []byte{10}, []byte{}, -1)
    
	return d
}

위에 url에 있는 내용을 수정한것이다

 

\r\n , \n , \r 을 빈값으로 변경하여 해결했다. 

이렇게 할 경우, 적절한 개행을 바꿀수가 없는데, 이건 방법이없다. 애초에 클라이언트쪽에서 잘못 보내고 있는것이니... 

 

 

문자열로도 같은 방법이 가능하다

 

    tmp := string(bodyBytes)
    tmp = strings.Replace(tmp, "\r\n", "", -1)
    tmp = strings.Replace(tmp, "\r", "", -1)
    tmp = strings.Replace(tmp, "\n", "", -1)
    tmp2 := []byte(tmp)

이런 방식으로 가능 

 

문자열, byte 배열 둘 다 가능하니 선택해서 개발하길 

반응형

댓글