2013-08-26 2 views
3

일부 JSON 시리얼 라이저는 빈 문자열 데이터 필드에 null을 반환합니다. 나는 ISuperObject을 만들 객체 (superobject)를 사용하고SuperObject에서 null 문자열을 처리 할 수 ​​없습니다.

{ 
"searchtext": null, 
"moretext": "contains something", 
"bookdate": 1377468000000, 
"empid": 12345, 
"listtype": 1 
} 

:

var 
    FJSONRequest: ISuperObject; 
then 
    FJSONRequest := SO(Request.Content); // Webservice request 

이 텍스트 'null'를 포함하는 문자열 개체를 반환합니다.

분명히 SuperObject는 따옴표를 신경 쓰지 않기 때문입니다 ("searchtext": a"searchtext": "a"과 같은 결과를 나타냄).

980 라인 토크 나이저 루틴에 들어가기 전에 어느 것이 해결책이 있습니까?

나는 라인을 따라 생각 (중/또는) 해요 :

  • 는 JSON 객체에서

  • 반환 빈 문자열을 널 데이터 필드를 떠나

하는 경우 그 밖의 모든 것은 여전히 ​​실패 할 수 있습니다.

FJSONRequest := SO(StringReplace(Request.Content,': null,',':,',[rfReplaceAll])); 

개발자의 앱에서 오는 요청을 처리하기 만하면되기 때문에 필요하지만 간단하지는 않습니다. 그 해결 방법은 일을하지 않도록 BTW 내가 정확히 the behaviour mentioned here하지만, 객체 (superobject) 코드의 다른 부분에서 발생하고있어
(아니, 그는 nullthere's a bug in the way Mono handles his datacontract 때문에 억제 할 수 없다.)

.

+1

null은 빈 문자열과 동일하지 않습니다. 그것은 완전히 다른 의미를 지닙니다. 'StringReplace'는 작동하지 않습니다. 텍스트가 무효화되는 것을 생각하십시오. –

+0

내 stringReplace()를 더 엄격하게 설정하지만 실제로는 절대적으로 아닙니다. –

+1

귀하가 언급 한 버그는 [보고되기 1 년 전에 고쳐진 것 같습니다] (https://code.google.com/p/superobject/source/detail?r=55d5b03a621bc2570e50da5d745ded4e9b0dfa12). 슈퍼 오브젝트가 유효한 JSON을 올바르게 파싱하고 무효 인 JSON을 전혀 거부하지 않기 때문에 'null'의 토큰 화 역시 정확합니다. 'TSuperObject.ParseEx'에서'tsNull' 상태 처리하기 (https://code.google.com/p/superobject/source/browse/superobject.pas#3400)를 찾으십시오. 최신 버전의 코드를 사용하고 있습니까? –

답변

3

다운로드 섹션에 공식 1.2.4 ZIP 파일 http://code.google.com/p/superobject/source/browse이 업데이트가의 http://code.google.com/p/superobject/downloads/list 2010 날짜 있지만, 개별 파일을 백업 10월 2012

당신이 마지막 URL로 이동 Download zip 당신이 할 수있는 클릭하면 때까지 그들을 검색하십시오.

이러한 업데이트 된 파일을 사용하면 특수 사례 null을 사용할 수 있습니다.

당신이 문자열 값 주위에 따옴표 생략하면 코드는 여전히 '용서'입니다 :

{ 
"bookdate": 1377554400000, 
"searchtext": a, 
"listtype": 1 
} 

을하지만

{ 
"bookdate": 1377554400000, 
"searchtext": , 
"listtype": 1 
} 
것처럼 지금 특별한 경우

{ 
"bookdate": 1377554400000, 
"searchtext": null, 
"listtype": 1 
} 

를 처리

또는

{ 
"bookdate": 1377554400000, 
"listtype": 1 
} 

이 릴리스는 VER230 (델파이 XE2는) 그 1.2 '공식'을 참고까지 지원 [실수 nil 또는 NULL 입력하지 마십시오].4는 최신 델파이 버전에서도 컴파일되지 않았습니다. 따라서 최신 버전의 델파이에서는 컴파일러 지시문을 패치해야합니다.

  • 을 부동 소수점 값이 정확한 정수 값이 일어난 경우, JSON은 후행 기간이 다음과 같습니다 :

    는 또한이 다음과 같은 수정

    { "floatingpointvalue"4}

    가 수정되었습니다 :

    { "floatingpointvalue"4}

  • 뛰어 다니는 날의 일광 절약 시간제 스위치에서 datetime 변환 오류가 발생합니다. 예, 잘 보이지 않습니다. 이 여전히 기본적으로 정의되어 있는지 {$IFDEF WINDOWSNT_COMPATIBILITY}

주에 둘러싸여 코드 섹션에 오류
이 있었다, 나는 당신이 정의하는, 예를 들어, 사용하지 않도록 제안 {.$IFDEF WINDOWSNT_COMPATIBILITY} [요즘 Windows NT에서 실행해야하는 사람은 누구입니까?]는 OS가 datetime 변환을 처리하도록합니다.

{$ELSE} 
function TzSpecificLocalTimeToSystemTime(
    lpTimeZoneInformation: PTimeZoneInformation; 
    lpLocalTime, lpUniversalTime: PSystemTime): BOOL; stdcall; external 'kernel32.dll'; 

function SystemTimeToTzSpecificLocalTime(
    lpTimeZoneInformation: PTimeZoneInformation; 
    lpUniversalTime, lpLocalTime: PSystemTime): BOOL; stdcall; external 'kernel32.dll'; 
{$ENDIF}