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

Json 如何调整SuperObject库使其行为不区分大小写?,json,delphi,case-sensitive,superobject,Json,Delphi,Case Sensitive,Superobject,我只是发现了一个艰难的方法,这意味着lWeekRecord['TT_WK_ID']与lWeekRecord['TT_WK_ID']不同(lWeekRecord是一个ISuperObject) 我在有限的SuperObject文档中找不到任何关于区分大小写的内容 有没有人发现/修复/入侵过这个;你能告诉我怎么做吗?我更喜欢接收JSON数据的Web服务对JSON名称大小写不敏感 已编辑: 我只需要使用另一个系统生成的JSON,这只会对我说话。我想对那个系统的开发者宽容一点。他们的JSON是序列化的C

我只是发现了一个艰难的方法,这意味着
lWeekRecord['TT_WK_ID']
lWeekRecord['TT_WK_ID']
不同(lWeekRecord是一个ISuperObject)

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

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

已编辑

我只需要使用另一个系统生成的JSON,这只会对我说话。我想对那个系统的开发者宽容一点。他们的JSON是序列化的C对象,我真的不在乎他们是调用变量foo还是foo。实际上,更糟糕的是:它们的对象的一部分是从提供给它们的数据库字段名派生的,而这些字段名甚至来自不同的RDBMS。因此,这是一个由多个参与者组成的依赖链,可能会破坏像区分大小写这样愚蠢的事情。
如果我能为这些人避免这种情况,我想这样做。

在这个链中,没有一个头脑正常的人会同时使用foo和foo(这在大多数rdmbse中都是不可能的),所以我不必对此加以防范。

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

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

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

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

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

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

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

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

如果你有两个独立的系统相互通信,那么你需要为每条消息签订一份合同。就拿这个示例消息来说吧:

{
“foo”:“值”
}
在Delphi中,名称不区分大小写,但在序列化时它确实很重要

TMessage = class
  Foo: string;
end;
将在序列化时生成

TMessage = class
private
  [SOName('foo')]
  FFoo: string;
public
  property Foo: string read FFoo write FFoo;
end;
{
“Foo”:“值”
}
根据合同,这是错误的

用属性标记字段,以在序列化时完全填充约定

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;

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

如果您有两个独立的系统相互通信,则需要为每条消息签订合同。就拿这个示例消息来说吧:

{
“foo”:“值”
}
在Delphi中,名称不区分大小写,但在序列化时它确实很重要

TMessage = class
  Foo: string;
end;
将在序列化时生成

TMessage = class
private
  [SOName('foo')]
  FFoo: string;
public
  property Foo: string read FFoo write FFoo;
end;
{
“Foo”:“值”
}
根据合同,这是错误的

用属性标记字段,以在序列化时完全填充约定

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;

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

David,您的
值:=obj[name]
有时可能有问题-@Arioch'这是伪代码,所以我看不出有任何问题。我相信任何读者都能理解伪代码片段的意图。你知道,伪代码往往被认为是一本教科书和粘贴的副本。另外,让我的评论作为自述文件中缺少gotcha的警告。David,您的
值:=obj[name]
有时可能有问题-@Arioch'这是伪代码,所以我看不出有任何问题。我相信任何读者都能理解伪代码片段的意图。你知道,伪代码往往被认为是一本教科书和粘贴的副本。另外,请允许我的评论作为自述文件中缺少gotcha的警告。
lWeekRecord['tt_wk_id']
这种方法被认为不是最高效的速度,有时可能会导致未记录的行为:它是否必须对传递的数据区分大小写?在解析之前,您可以将所有json有效负载字符串(包括名称和值)都大写或小写吗?不要将Pascal语义强加于json.:-)您的Web服务主要是编写的,还是刚刚开始?你能考虑其他的LIB吗?我在mormotwebservices/JSON库中发现了这一点:
TJSONTable=class(TObject)。。。。处理mORMot服务器返回的JSON结果表。。。函数FieldIndex(const FieldName:string):整数。。。对字段名进行不区分大小写的搜索
,因为
IDispatch
通常不区分大小写,这可能也会起作用(尽管我不知道这是否安全)
var V:variant;begin V:=TDocVariant.NewJSON('{“id”:10,“doc”:{“name”:“John”,“birthyear”:1972}');断言(V.id=10);断言(V.doc.name='John')
TDocVariantOption=(dvonamecase敏感,dvoCheckForDuplicatedNames…
lWeekRecord['tt_wk_id']
这种方法被认为不是最高效的速度,有时可能导致未记录的行为:它是否必须对所传递的数据区分大小写?您可以吗