예전에는 게임 프로그램에서 사용하는 프로그램 설정 이나 게임 데이터를 ini 파일이나 혹은 xml 파일을 사용했는데 몇 년 전부터 json 데이터 포맷이 인기를 끌면서 json을 많이 사용하고 있다.

 

C++에서도 json 데이터를 다룰 수 있는 라이브러리 사용이 필수라고 생각한다.

C++ json 라이브러리 중 JsonCpp가 유명한데, 편리성에서 JSON for Modern C++ 이 더 좋고, 성능에서는 Rapid Json 이 더 좋은 것 같아서 이 2개의 라이브러리에 대해서 정리했다.

 

아래 자료는 NEXT의 게임 클라이언트/서버 과정에서 학생들이 정리한 것이다.

 

 

rapidjson.zip 

 

Rapid Json 은 중국의 텐센트에서 사용하고 있고, 아마 이 라이브러리 개발자가 텐센트에서 근무하고 있지 않을까 생각된다. https://github.com/TencentOpen/rapidjson

 

 

 

저작자 표시
신고
by 흥배 2016.04.14 09:29

클라이언트와 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 값을 정수로 표현하였다.



저작자 표시
신고
by 흥배 2014.11.28 08:00
| 1 |

티스토리 툴바