SuperObject无法处理空字符串

时间:2013-08-26 13:25:22

标签: 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(Request.Content);   // Webservice request

返回一个包含文本'null'的字符串的对象。

显然这是因为SuperObject不关心引号("searchtext": a给出的结果与"searchtext": "a"相同)。

在深入了解980-line tokenizer例程之前,有没有人有解决方案?

我正在思考(或/或):

  • 将空数据字段保留在JSON对象

  • 之外
  • 返回一个空字符串

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

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

因为我只需要处理来自我们某个开发人员的应用程序的请求,但这并非万无一失。
(不,他不能压制null因为there's a bug in the way Mono handles his datacontract。)< / p>

顺便说一下,我正在体验the behaviour mentioned here,但在SuperObject代码的另一部分中,因此解决方法无法完成工作。

1 个答案:

答案 0 :(得分:3)

下载部分http://code.google.com/p/superobject/downloads/list中的官方1.2.4 ZIP文件的日期为2010年,但http://code.google.com/p/superobject/source/browse中的各个文件的更新截至2012年10月。

如果您转到最后一个网址并点击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会有一个尾随句点:

    {“floatingpointvalue”:4.}

    现在已修复:

    {“floatingpointvalue”:4}

  • 日期时间转换中发生错误的转换为夏令时的夏令时 - 是的,模糊不清。
    {$IFDEF WINDOWSNT_COMPATIBILITY}

  • 包围的代码部分出错

请注意,这仍然是默认定义的,我建议您禁用定义,例如与{.$IFDEF WINDOWSNT_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}