为什么TJson.ObjectToJsonObject/ObjectToJsonString将记录字段表示为JSON数组?
SuperObject和TJson.ObjectToJsonObject表示类的某些部分(即记录字段)的方式不一致。让我们看一下下面的代码片段:为什么TJson.ObjectToJsonObject/ObjectToJsonString将记录字段表示为JSON数组?,json,delphi,records,superobject,delphi-xe7,Json,Delphi,Records,Superobject,Delphi Xe7,SuperObject和TJson.ObjectToJsonObject表示类的某些部分(即记录字段)的方式不一致。让我们看一下下面的代码片段: Uses rest.json, superobject; type TSimplePersonRec = record FirstName: string; LastName: string; Age: byte; end; TSimplePerson = c
Uses rest.json, superobject;
type
TSimplePersonRec = record
FirstName: string;
LastName: string;
Age: byte;
end;
TSimplePerson = class
protected
FPersonRec: TSimplePersonRec;
public
property personRecord: TSimplePersonRec read FPersonRec write FPersonRec;
end;
// ...
{ Public declarations }
function toJson_SO(simplePerson: TSimplePerson): string;
function toJson_Delphi(simplePerson: TSimplePerson): string;
// ...
function TForm1.toJson_Delphi(simplePerson: TSimplePerson): string;
begin
result := tjson.Format(TJson.ObjectToJsonObject(simplePerson));
end;
function TForm1.toJson_SO(simplePerson: TSimplePerson): string;
var
so: ISuperObject;
ctx: TSuperRttiContext;
begin
ctx := TSuperRttiContext.Create;
try
so := ctx.AsJson<TSimplePerson>( simplePerson );
finally
ctx.Free;
end;
result := so.AsJSon(true, true);
end;
// ...
procedure TForm1.Button3Click(Sender: TObject);
var
spr: TSimplePersonRec;
sp: TSimplePerson;
begin
spr.FirstName := 'John';
spr.LastName := 'Doe';
spr.Age := 39;
sp := TSimplePerson.Create;
sp.personRecord := spr;
memo1.Lines.Add(#13'--- SuperObject ---'#13);
memo1.Lines.Add(toJson_SO(sp));
memo1.Lines.Add(#13'--- Delphi ---'#13);
memo1.Lines.Add(toJson_Delphi(sp));
end;
Delphi将记录表示为JSON数组的原因是什么?是否有公共标准或建议导致这种情况
注意:
对我来说,用{key:value}符号而不是数组来表示记录更自然。在反序列化过程中,不知道值所属的键名可能会产生奇怪的结果。例如,在反序列化期间,我可以传递具有相同布局的新类,其中包含具有不同内存布局的记录。在这种情况下,值将随机分配,或者可能发生AV
更新:
我使用的是DelphiXe7。
我在json.org上还发现了以下内容:
JSON构建在两种结构上:
- 名称/值对的集合。在各种语言中,这是作为对象、记录、结构、字典、哈希表、键控实现的 列表或关联数组李>
- 值的有序列表。大多数 语言,这是作为数组、向量、列表或序列实现的
因此,问题可能更多的是关于TJson单元中的错误吗?Delphi输出是合法的JSON。在内部,
REST.TJson
是硬编码的,用于将记录封送为JSON数组。这就是它的实现方式,它是通过设计实现的,而不是一个bug。这只是表示数据的另一种方式。SuperObject选择更加明确。那也可以。两种不同的实现,两种不同的表示。JSON规范允许两者。TJson试图解决什么问题?它是否试图成为一个全面的JSON库?或者它只是想做任何需要它的事情?当然,你应该像其他人一样使用superobject always.json.org说:json构建在两个结构上:1)名称/值对的集合。在各种语言中,这是作为对象、记录、结构、字典、哈希表、键控列表或关联数组实现的。2) 值的有序列表。在大多数语言中,这是以数组、向量、列表或序列的形式实现的所以问题是这是TJSON单元中的一个bug吗?顺便说一句,是哪个版本的Delphi?我的版本是Delphi Xe7Test。我希望它也能表现得像超级对象一样。但很难回答真正的问题。如果输出本身没有错误,则可能是一个功能。如果它是一个bug,因为它是未记录的行为,那么自Delphi7以来添加的每个特性基本上都是一个bug有一天,有人可以邀请他的实现,其中一个整数字段被表示为一个包含5个元素的JSON数组,实际数字将存储在第3位。JSON规范也允许这样做,但它不可移植,而且很奇怪。将键/值对表示为有序值的数组是供应商发明的“协议”,而且不可移植,也很奇怪。就是。我更喜欢贴一个QC来增强:)
--- SuperObject ---
{
"FPersonRec": {
"LastName": "Doe",
"Age": 39,
"FirstName": "John"
}
}
--- Delphi ---
{
"personRec":
[
"John",
"Doe",
39
]
}