delphi - 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(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
}

[不要意外输入 nilNULL]

此版本支持 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/

相关文章:

delphi - Application.Restore 无法让我回到之前的位置,为什么?

delphi - 六角格计算

delphi - Delphi XE2中的Dcu

delphi - 有没有更简单的方法来进行 boolean 转换?

multithreading - 如何使用 OmniThreadLibrary 访问线程变量?

delphi - 带有 FM3 的 Windows XP 中缺少任务栏按钮上下文菜单

Java:对象的默认值null更好

sql - 在 SQL Server 中创建具有空值的插入查询

delphi - 防止双击 TButton

c# - "x is null"和 "x == null"有什么区别?