Delphi SuperObject无法处理空字符串
一些JSON序列化程序返回空字符串数据字段的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
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}