3

一部の JSON シリアライザnullは、空の文字列データ フィールドを返します。

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

SuperObject を使用して ISuperObject を作成しています。

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

これは、テキストを含む文字列を持つオブジェクトを返します'null'

明らかにこれは、SuperObject が引用符を気にしないためです ("searchtext": aと同じ結果が得られます"searchtext": "a")。

980 行のトークナイザー ルーチンに飛び込む前に、解決策はありますか?

私は次のように考えています(どちらか/または):

  • JSON オブジェクトから null データフィールドを除外します

  • 空の文字列を返す

他のすべてが失敗した場合でも、私はまだできる

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

開発者の 1 人からのアプリからのリクエストのみを処理する必要があるためですが、それは絶対確実ではありません。(いいえ、 Mono が datacontract を処理する方法にバグがあるため
、彼は を抑制することができません。)null

ところで、私はここで述べた動作を正確に経験していますが、SuperObject コードの別の部分で、その回避策は機能しません。

4

1 に答える 1

3

ダウンロード セクションhttp://code.google.com/p/superobject/downloads/listの公式 1.2.4 ZIP ファイルは2010 年のものですが、 http://code.google.com/p/superobjectの個々のファイルは/source/browseには 2012 年 10 月までの更新があります。

その最後の URL に移動してクリックすると、Download zipそれらを取得できます。

これらの更新されたファイルでは、特殊なケースを使用できますnull

文字列値を囲む引用符を省略しても、コードは「寛容」です。

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

しかし、今では特別なケースを処理します

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

あたかもそうであるかのように

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

また

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

[誤って入力しないでnilくださいNULL]

このリリースは、VER230 (Delphi XE2) までサポートします [「公式」の 1.2.4 は、最近の Delphi バージョンではコンパイルすらされていないことに注意してください]。それ以降のバージョンの Delphi では、コンパイラ ディレクティブにパッチを適用する必要があります。

また、次の修正も行います。

  • 浮動小数点値がたまたま正確な整数値を持つ場合、JSON の末尾にはピリオドが付きます。

    { "floatingpointvalue": 4. }

    これは修正されました。

    { "浮動小数点値": 4 }

  • うるう年の夏時間への切り替えの前後で発生する日時変換のエラー-はい、あいまいです。
    で囲まれたコードセクションにエラーがありました{$IFDEF WINDOWSNT_COMPATIBILITY}

これはデフォルトでまだ定義されていることに注意してください。たとえば、{.$IFDEF WINDOWSNT_COMPATIBILITY}[今日は Windows NT で実行する必要がある人は?] などで define を無効にすることをお勧めします。これにより、OS が日時変換を処理できるようになります。

{$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}
于 2013-08-27T09:56:49.593 に答える