如何调整SuperObject库以使其行为不区分大小写?

时间:2016-01-11 15:29:51

标签: json delphi case-sensitive superobject

我只是找出了JSON is case sensitive的困难方式,这意味着lWeekRecord['TT_WK_ID']lWeekRecord['tt_wk_id']不同(lWeekRecord是一个ISuperObject)。

我在有限的SuperObject文档中找不到关于区分大小写的任何内容。

有没有人发现/修复/黑客攻击;并且可以告诉我该怎么做?
我更喜欢接收JSON数据的webservice对JSON名称大小写不敏感。

被修改

我只需使用其他系统生成的JSON,而且只与我交谈。我希望对该系统的开发人员宽容。他们的JSON是序列化的C对象,如果他们调用他们的变量 foo Foo ,我真的不在乎。实际上,情况更糟:它们的部分对象来自提供给它们的数据库字段名称,这些甚至来自不同的RDBMS。因此,这是一个涉及多个参与者的依赖链,可以在案例敏感的情况下打破一些愚蠢的行为 如果我能为那些人避免这种情况,我想 在这个链条中没有一个正确的人会同时使用 foo Foo (这在大多数RDMBS中都是不可能的),所以我不会&#39不得不提防。

2 个答案:

答案 0 :(得分:3)

这不是一个超级对象问题。相反,这是JSON本身的属性,它使用区分大小写的比较。

如果您真的想让您的服务对字母大小写不敏感,那么您需要自己实施密钥查找。而不是在对象中查找命名值,迭代所有名称/值对并执行您希望进行的任何比较。在伪代码中,它将是这样的:

value := nil;
for name in obj do
  if SameText(name, targetName) then
  begin
    value := obj[name];
    break;
  end;

我强烈建议你不要这样做。 JSON区分大小写。这就是它的设计方式,如果顺其自然,你会发现生活更轻松。以这种方式逆潮流肯定会在以后引发各种各样的麻烦。

答案 1 :(得分:3)

如果您有两个独立的系统相互通信,则需要为每条消息签订合同。只需获取此示例消息:

{
  "foo": "value"
}

在Delphi中,名称不区分大小写,但在序列化时,它确实很重要。

TMessage = class
  Foo: string;
end;

将生成序列化

{
  "Foo": "value"
}

合同错误。

使用属性标记字段以在序列化上填写合同

TMessage = class
private
  [SOName('foo')]
  FFoo: string;
public
  property Foo: string read FFoo write FFoo;
end;

<强>更新

使用这些属性可以让你在混合大写小写名称的情况下完成更糟糕的合同

TWorseMessage = class
private
  [SOName('foo')]
  FSmallFoo: string;
  [SOName('Foo')]
  FBigFoo: string;
public
  property SmallFoo: string read FSmallFoo write FSmallFoo;
  property BigFoo: string read FBigFoo write FBigFoo;
end;

这是可能的,但你不应该在实际生产中使用它。