2016-09-23 1 views
1

제 목표는 JSON 형식을 사용하여 임의의 데이터 행을 동기화하는 것입니다. 행에 대한 정확한 체계를 모르므로 (일반적인 동기화 방법), 데이터 모델은 분명히 "객체"에 의존해야합니다. 따라서 자바에서는 서버와 동기화 할 배열이 Map<String,Object>이됩니다. JSON에moshi로 deserialize 할 때 long 및 double 값을 구별하는 방법은 무엇입니까?

번역 이러한 행은 지금까지 너무 좋아

{{"string":"stringvalue"},{"double1":1234.567},{"double2":1234.0},{"long":1234}} 

같은 것을주지 않았 - 문제를 모시로 - 모든 것이 예상대로 작동합니다.

이제 문제 : moshi로 JSON을 deserialize하려고하면 "long"멤버에 대해 double 값이 반환됩니다. 모시는 모든 수를 더블로 변환합니다. 그러나 불행히도 모든 숫자가 안전하게 double로 변환 될 수있는 것은 아닙니다. 매우 큰 정수 (long long)는 제한된 복소수의 정밀도에 문제가 있습니다. 반올림 효과도있을 수 있습니다.

나는 moshi와 관련된 문제를 열었지만 불행히도 닫혔습니다. 어쩌면 충분히 명확하지 않을 수도 있습니다. (Issue 192)

JSON에는 정수 전용 숫자 및 문자열 개념이 없습니다. 그러나 위의 예제에서 "double2"의 미묘한 세부 사항은 내 문제에 대한 해결책으로 이어질 수 있습니다.
숫자에 소수점이 포함되지 않으면 숫자이며 정수로 변환해야합니다.

길이가 무손실로 double로 변환 될 수 없기 때문에 값이 double로 변환되기 전에 파서를 가로채는 방법이 필요합니다. 그러나 그것을하는 방법?

모시는 JsonAdapters이 편리한 개념이 -하지만 불행히도 나는 현재 내가이 경우 사용할 수있는 방법을 볼 수 없습니다 :
JsonAdapter 내가 생성 된 캐스트 수 없기 때문에 개체 수 할 것 등의 입력 형 두 배에서 길게. 그래서 그는 파서를 가로 채서 어떤 값을 변환해야합니다.
하지만 거기에서 하나 이상의 유형을 반환하는 방법은 무엇입니까? (거기에서 String, Double 또는 Long을 반환해야합니다. 또는 입력을 숫자로만 제한 할 수 있다면 적어도 Longs 또는 Double을 반환해야합니다.)

(백엔드는 PHP로 작성되어 자동으로 생성됩니다. 원하는 출력 : 정수는 소수점없이 쓰여집니다.)

답변

1

모시 소스 코드를 변경하지 않으면 불가능합니다. JSON 문자열 소스는 모든 숫자를 double로 변환하는 JsonReader을 통과합니다. 모든 하위 클래스가 패키지로 보호되어 있기 때문에이 동작을 변경하는 방법을 찾지 못했습니다.