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 对象之外

  • 返回一个空字符串

如果一切都失败了,我仍然可以做

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

因为我只需要处理来自我们一位开发人员的应用程序的请求,但这并不是万无一失的。
(不,他不能抑制,null因为Mono 处理他的 datacontract 的方式存在错误。)

顺便说一句,我正在经历这里提到的行为,但是在 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
}

[不要意外键入nilNULL]

此版本支持直到 VER230 (Delphi XE2) [请注意,'官方' 1.2.4 甚至没有在更新的 Delphi 版本上编译],因此对于更高版本的 Delphi,您必须修补编译器指令。

它还修复了以下问题:

  • 当浮点值恰好具有精确的整数值时,JSON 将有一个尾随句点:

    {“浮点值”:4。}

    现在已修复:

    { “浮点值”:4 }

  • 在闰年切换到夏令时发生的日期时间转换错误 - 是的,晦涩难懂。
    被包围的代码部分有错误{$IFDEF WINDOWSNT_COMPATIBILITY}

请注意,这仍然是默认定义的,我建议您禁用 define ,例如使用{.$IFDEF WINDOWSNT_COMPATIBILITY}[who need to run on Windows NT now?],它可以让操作系统处理日期时间转换:

{$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 回答