一些 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]));
因为我只需要处理来 self 们一位开发人员的应用程序的请求,但这并不是万无一失的。
(不,他无法抑制 null
因为 there's a bug in the way Mono handles his datacontract 。)
顺便说一句,我正在经历the behaviour mentioned here ,但在 SuperObject 代码的另一部分中,因此该解决方法不起作用。
最佳答案
下载部分的官方1.2.4 ZIP文件http://code.google.com/p/superobject/downloads/list日期为 2010 年,但 http://code.google.com/p/superobject/source/browse 中的各个文件截至 2012 年 10 月都有更新。
如果您转到最后一个 URL 并单击下载 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 将具有尾随句点:
{“浮点值”:4。}
此问题现已修复:
{“浮点值”: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}
关于delphi - SuperObject 无法处理空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18445280/