글
예전에는 게임 프로그램에서 사용하는 프로그램 설정 이나 게임 데이터를 ini 파일이나 혹은 xml 파일을 사용했는데 몇 년 전부터 json 데이터 포맷이 인기를 끌면서 json을 많이 사용하고 있다.
C++에서도 json 데이터를 다룰 수 있는 라이브러리 사용이 필수라고 생각한다.
C++ json 라이브러리 중 JsonCpp가 유명한데, 편리성에서 JSON for Modern C++ 이 더 좋고, 성능에서는 Rapid Json 이 더 좋은 것 같아서 이 2개의 라이브러리에 대해서 정리했다.
아래 자료는 NEXT의 게임 클라이언트/서버 과정에서 학생들이 정리한 것이다.
Rapid Json 은 중국의 텐센트에서 사용하고 있고, 아마 이 라이브러리 개발자가 텐센트에서 근무하고 있지 않을까 생각된다. https://github.com/TencentOpen/rapidjson
글
클라이언트와 Json 데이터를 주고 받는 도중 숫자가 포함된 Json 문자열을 구조체로 Deserialize 할 때
'Expected digit' 예외가 발생.
var jsonObject = Jil.JSON.Deserialize<REQUSET_T>(decryptData);
위치: Jil.Deserialize.Methods._ReadInt64(TextReader reader) 파일 c:\Users\kevin_000\Dropbox\jil\Jil\Deserialize\Methods.ReadNumbers.cs:줄 519
위치: _DynamicMethod0(TextReader )
위치: Jil.JSON.Deserialize[T](TextReader reader, Options options) 파일 c:\Users\kevin_000\Dropbox\jil\Jil\JSON.cs:줄 579
테스트로 Jil로 숫자가 포함된 구조체를 Serialize한 Deserialize 하면 아무런 문제가 없음.
그러나 같은 내용을 클라이언트에서 JsonFX로 Serialize한 후 Jil로 Deserialize 하면 여전히 예외발생.
이번에는 JsonFX로 Serialize 하고, Json.NET로 Deserialize 해 보았음. 아무런 문제 없음.
그래서 JsonFx와 Jil로 Serialize 할 때의 차이를 보니 아래와 같음
JsonFX: {"LSeq":"533157870896947200","ID":"Dummy_1","AT":"63327632"}
Jil: {"LSeq":533157870896947200,"ID":"Dummy_1","AT":"63327632"}
LSeq가 정수인데 JsonFX는 값을 문자열처럼 만듬, 그에 비해 Jil은 숫자로 표시
JsonFX나 Json.NET은 "533157870896947200" 표현되더라도 Deserialize 할 때 해당 필드가 정수라면 정수로 변환해줌.
그러나 Jil은 문자열로만 인식하여 정수가 아니라고 예외를 발생 시킴.
이 문제를 해결할 방법이 없는한 Jil로 Json 포맷을 다루지 않는 경우라면 Jil은 사용하지 않아야 됨
===> 이 문제는 JsonFX의 문제가 아니고 Json 사양에 따른 문제임
Json은 정수는 int와 double만 지원한다. 만약 double 보다 큰 값을 사용하면 문자열로 치환한다.
위에서 LSeq의 값은 Int64의 값으로 double의 최대값 보다 크다. 그래서 JsonFX에서 문자열로 표현하였다.
Jil은 Json 사양과 다르게 Int64를 지원한다. 그래서 LSeq 값을 정수로 표현하였다.
댓글