某些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代码的另一部分中,因此解决方法无法完成工作。
答案 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
}
[请勿意外输入nil
或NULL
]
此版本支持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}