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']
这种方法被认为不是最高效的速度,有时可能导致未记录的行为:它是否必须对所传递的数据区分大小写?您可以吗