0

我只是发现JSON 区分大小写的困难方式,这意味着它lWeekRecord['TT_WK_ID']lWeekRecord['tt_wk_id'](lWeekRecord 是一个 ISuperObject)不同。

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

有没有人发现/修复/破解过这个;能告诉我怎么做吗?
我更喜欢接收 JSON 数据的 Web 服务对 JSON 名称大小写不敏感。

编辑

我只需要使用由另一个系统生成的 JSON,它只对我说话。我想对那个系统的开发者宽容一点。他们的 JSON 是序列化的 C 对象,我真的不在乎他们是否调用他们的变量fooFoo。实际上,更糟糕的是:它们的部分对象是从提供给它们的数据库字段名称派生的,这些甚至来自不同的 RDBMS。因此,这是一个涉及多个参与者的依赖链,可能会因为区分大小写而中断一些愚蠢的事情。
如果我可以为那些人避免这种情况,我想这样做。
这条链中没有一个头脑正常的人会同时使用fooFoo在一起(这在大多数 RDMBS 中甚至是不可能的),所以我不必提防这种情况。

4

2 回答 2

3

这不是真正的 SuperObject 问题。相反,这是 JSON 本身的一个属性,它使用区分大小写的比较。

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

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

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

于 2016-01-11T15:47:04.190 回答
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;

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

于 2016-01-11T17:46:10.277 回答