json - SuperObject 多维数组

标签 json delphi multidimensional-array superobject

我正在使用 Delphi XE4 和 SuperObject 1.24

我有以下结构:

type
  TMyArray = Array of Array of Variant;
  TMyRecord = Record
     Values : TMyArray;
  end;

var
 T,W : TMyRecord;
 S : String;
 i : integer;

begin
 SetLength(T.Values, 2 );
 for i := 0 to 1 do
   SetLEngth(T.Values[i],2);

 T.Values[0,0] := 'Hello World';
 T.Values[0,1] := 'Foo';
 T.Values[1,0] := 'Bar';
 T.Values[1,1] := 'is here';

 R := TSuperRttiContext.Create;

 S := R.AsJson<TMyRecord>(T).AsString;
 W := R.AsType<TMyRecord>( SO(S) );
 R.Free;
end;

S 包含 {"Values":[["Hello World","Foo"],["Bar","is here"]]} 这似乎是正确的

W 显示 (((Delphi 异常 EVariantBadVarTypeError at $294AD325, Variant array of Unknown), (Variant array of Unknown, Variant array of Unknown)))

如何正确重新创建多维数组?

最佳答案

我找到了实现它的方法。我在谷歌上搜索了很多,但没有找到任何可以使用的:( 这是我写的代码:

// Types and routines
type
  TMyArray = Array of Array of Variant;
  TMyRecord = Record
     Lines   : Integer;
     Columns : Integer;
     Values  : TMyArray;
  end;

 function JSONToDynVariantArray( ctx: TSuperRttiContext; const aObj : ISuperObject;
      var aValue : TValue ) : Boolean;
 var
   i,j: Integer;
  Row,
  Col : ISuperObject;
  SuperType : TSuperType;

  MyData : TMyRecord;

begin
  SuperType := ObjectGetType(aObj);
  case SuperType of
     stNull : begin
       aValue := nil;
       Result := True;
     end;
     stArray : Begin
     End;
    stObject : Begin
        MyData.Lines := aObj.I['Lines'];
        MyData.Columns   := aObj.I['Columns'];
        SetLength(RecData.Values, MyData.Lines, MyData.Columns );
        for i := 0 to aObj.A['Values'].Length -1 do begin
           Row :=  aObj.A['Values'][i];
            for j := 0 to Row.AsArray.Length -1 do begin
                Col := Row.AsArray[j];
                SuperType := ObjectGetType(Col);
                case SuperType of
                   stNull     : MyData.Values[i,j] := varNull;
                   stBoolean  : MyData.Values[i,j] := Col.AsBoolean;
                   stDouble   : MyData.Values[i,j] := Col.AsDouble;
                   stCurrency : MyData.Values[i,j] := Col.AsCurrency;
                   stInt      : MyData.Values[i,j] := Col.AsInteger;
                   stString   : MyData.Values[i,j] := Col.AsString;
                end;
            end;
        end;
        TValue.Make(@MyData, Typeinfo(TMyRecord), aValue);
        Result := True;
    End;
  end;
end;

// Main code

var
  T ,
  W : TMyRecord;
  S : String;
  R : TSuperRttiContext;

begin
  inherited;
  T.Lines := 2;
  T.Columns   := 2;
  SetLength(T.Values, T.Lines,T.Columns );
  T.Values[0,0] := 'Hello World';
  T.Values[0,1] := Date;
  T.Values[1,0] := 10;
  T.Values[1,1] := 234.45;

  R := TSuperRttiContext.Create;

  // This is a very nice feature!!!
  R.SerialFromJson.Add(TypeInfo(TMyRecord), JSONToDynVariantArray );

  S := R.AsJson<TMyRecord>(T).AsString;
  W := R.AsType<TMyRecord>( SO(S) );

  R.Free;
end;

HTH, 克莱门特

关于json - SuperObject 多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16877384/

相关文章:

c++ - 多维数组的 vector

delphi - 如何知道我的控件何时改变大小?

delphi - 如何设置 cookie HTTPOnly 标志?

delphi - Delphi 7中处理海量文本文件数据的最佳解决方案

android - 带有 JSON 字符串的 HTTP post

c++ - 可变多维数组

php - 帮我从多维 PHP 数组中获取一个值

c# - 在 JSON.NET 中序列化派生类时的字段顺序

javascript - 来自 json 的微数据

php - 如何在 dart 的 Future 函数中从 JSON 创建一个类对象?