类型:
TData = record
str: string;
int: Integer;
boo: Boolean;
flt: Double;
end;
TDataArray = Array [0..5] of TData;
TObj = class
private
str: string;
int: Integer;
boo: Boolean;
flt: Double;
public
constructor Create(s: string; i: Integer; b: Boolean; f: Double);
end;
Run Code Online (Sandbox Code Playgroud)
Testcode:
procedure TFrmJSONRTTI.FormShow(Sender: TObject);
var
DataArray,
NewArray : TDataArray;
Ob,NewOb : TObj;
so : ISuperObject;
ctx : TSuperRttiContext;
i : integer;
begin
Log('SERIALIZING Static data');
Log('');
Log('type');
Log(' TData = record');
Log(' str: string;');
Log(' int: Integer;');
Log(' …Run Code Online (Sandbox Code Playgroud) 我正在使用SuperObject来生成JSON.我正在使用的服务器有一些排序数据结果的规范(事实上,这与排序数据有关,这与我关于排序的实际问题无关).问题是,服务器期望按照如何排序的顺序列出这些值,例如......
"sort": {
"first_sort_field": 1,
"second_sort_field": 1,
"third_sort_field": -1,
"fourth_sort_field": 1
}
1表示升序,-1表示降序.但那不是重要的部分.重要的是,sort必须以这种方式组织对象中的这些值.
为了生成这个对象,我这样做:
var
O, O2: ISuperObject;
X: Integer;
//more
begin
O:= SO; //main object
//more
O2:= SO; //sub object
for X := 0 to FSort.Count - 1 do begin
case FSort[X].Direction of
sdAscending: O2.I[FSort[X].FieldName]:= 1;
sdDescending: O2.I[FSort[X].FieldName]:= -1;
end;
end;
O.O['sort']:= O2;
//more
end;
Run Code Online (Sandbox Code Playgroud)
当我使用SuperObject序列化这个"排序"对象时出现问题.值似乎是重新排列的,所以例如上面的JSON实际上会出现这样的事情:
"sort": {
"first_sort_field": 1,
"fourth_sort_field": 1
"second_sort_field": 1,
"third_sort_field": -1,
}
这与我的意图不同.这会导致服务器返回以不同于预期的方式排序的响应数据.
问题是,如何使SuperObject按照我添加的顺序而不是自己的顺序序列化数据?我认为它可能是按ABC顺序排序值,但是当组合不同类型的值(字符串,整数,对象,数组等)时,它们不是ABC顺序.我想强制SuperObject按照我添加它的顺序序列化数据.
我能看到的唯一解决方案是通过连接字符串手动序列化此对象.但是我想尽可能避免这种情况 - 这就是我首先使用SuperObject的原因.
我最近已经从使用ULKJson切换到SuperObject,我一直在寻找包装附带的示例,并且已经取得了一些进展,但是看起来我遇到了障碍.更具体地说,我似乎无法找到一个示例来说明如何访问数组中的项目,如下例中的项目.
{
"name": "John Smith",
"tel": 555-5555,
"age": 18,
"height": 1.8,
"place": [{"address": "PO Box 1234", "city": "Florida", "code": 2000},
{"address": "1 Sparrow street", "city": "Florida", "code": 2000}]
}
Run Code Online (Sandbox Code Playgroud)
要访问常规项目,我使用以下代码似乎工作得很好.
procedure TForm1.Button1Click(Sender: TObject);
var
SO : ISuperObject;
age, height, tel : Integer;
name : String;
begin
SO := TSuperObject.ParseFile('JSON.txt',true);
name := SO.S['name'];
age := SO.I['age'];
tel := SO.I['tel'];
height := SO.I['height'];
Memo1.Lines.Clear;
Memo1.Lines.Add('Name: ' + name);
Memo1.Lines.Add(#10#13);
Memo1.Lines.Add('Age: ' + age);
Memo1.Lines.Add(#10#13);
Memo1.Lines.Add('Telephone: ' + tel);
Memo1.Lines.Add(#10#13);
Memo1.Lines.Add('Height: ' + …Run Code Online (Sandbox Code Playgroud) 我需要加载一个 JSON 文件,更改一个值,然后将其写回磁盘。
使用 SuperObject 很容易,但我如何使用 System.JSON 单元做同样的事情?
const
PathToX = 'AllCategories.Category[0].subCategory[0].products[0].views.view[0].x';
var
JsonFilename: string;
JO: ISuperObject; // from the SuperObject unit
JV: TJsonValue; // from the System.Json unit
begin
JsonFilename := ExtractFilePath(Application.ExeName)+'product.json');
// Using the SuperObject unit:
JO := SO(TFile.ReadAllText(JsonFilename));
WriteLn('The old value of "x" is ', JO[PathToX].AsString);
WriteLn('Changing value of x to "123"');
JO.S[PathToX] := '123'; // Set the value of "x"
WriteLn('The new value of "x" is ', JO[PathToX].AsString);
// Now trying to do the same thing …Run Code Online (Sandbox Code Playgroud) 如何通过SuperObject库将记录数组存储在JSON中.例如..
type
TData = record
str: string;
int: Integer;
bool: Boolean;
flt: Double;
end;
var
DataArray: Array[0..100] of TData;
Run Code Online (Sandbox Code Playgroud) delphi ×5
json ×5
superobject ×5
arrays ×1
delphi-xe2 ×1
delphi-xe3 ×1
sorting ×1
system.json ×1