标签: superobject

无法将SuperObject JSON反序列化为Object

类型:

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)

delphi json access-violation delphi-xe2 superobject

3
推荐指数
1
解决办法
1258
查看次数

Delphi SuperObject以不同于添加的顺序对值进行排序

我正在使用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的原因.

delphi sorting serialization json superobject

3
推荐指数
1
解决办法
1575
查看次数

使用SuperObject访问JSON数组

我最近已经从使用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)

arrays delphi json superobject

3
推荐指数
1
解决办法
3288
查看次数

Delphi XE7:如何使用 System.JSON(与 SuperObject)更改 JSON 值

我需要加载一个 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)

delphi json system.json superobject

3
推荐指数
1
解决办法
7184
查看次数

以JSON格式存储记录数组

如何通过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 json delphi-xe3 superobject

2
推荐指数
1
解决办法
3019
查看次数