클라이언트와 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 |