Delphi SuperObject无法处理空字符串

Delphi SuperObject无法处理空字符串,delphi,null,delphi-xe2,superobject,Delphi,Null,Delphi Xe2,Superobject,一些JSON序列化程序返回空字符串数据字段的null,例如: { "searchtext": null, "moretext": "contains something", "bookdate": 1377468000000, "empid": 12345, "listtype": 1 } 我正在使用SuperObject创建ISuperObject: var FJSONRequest: ISuperObject; then FJSONRequest := SO(Reque

一些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
,因为。)


顺便说一句,我正经历着这种情况,但在SuperObject代码的另一部分,因此变通方法无法完成这项工作。

下载部分中的官方1.2.4 ZIP文件从2010年开始,但中的各个文件直到2012年10月都有更新

如果您转到最后一个URL并单击
Download zip
,您可以检索它们

这些更新的文件允许您使用特殊情况
null

如果忽略字符串值周围的引号,代码仍然是“宽容的”:

{
 "bookdate": 1377554400000,
 "searchtext": a,
 "listtype": 1
}
但它现在处理特殊情况

{
 "bookdate": 1377554400000,
 "searchtext": null,
 "listtype": 1
}
好像是

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

[不要意外键入
nil
NULL
]

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

它还修复了以下问题:

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

    {“floatingpointvalue”:4.}

    这是现在固定的:

    {“floatingpointvalue”:4}

  • 在转换为夏时制时发生的日期时间转换错误(以年为单位)-是的,不清楚。
    {$IFDEF WINDOWSNT\u COMPATIBILITY}

    包围的代码部分出错

请注意,这仍然是默认定义的,我建议您禁用定义,例如使用
{.$IFDEF WINDOWSNT\u COMPATIBILITY}
[现在谁需要在Windows NT上运行?],这样操作系统就可以处理日期时间转换:

{$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}

null与空字符串不同。它有完全不同的含义。您的
StringReplace
无法工作。想想它对被取消的文本有什么影响。将我的stringReplace()设置得更紧一些,但实际上并不是万无一失的。您提到的错误似乎是。而且
null
的标记化似乎也是正确的,因为超级对象正确地解析了有效的JSON并拒绝了所有无效的JSON。寻找。你确定你使用的是最新版本的代码吗?@Rob:Bummer。下载部分中的官方1.2.4 ZIP文件的日期为2010年,但中的单个文件直到2012年10月才有更新。谢谢,我会做文件比较,然后再报告。
{$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}