2013-03-15 70 views
2

如何通过SuperObject库以JSON格式存储记录数组。例如..以JSON格式存储记录数组

type 
    TData = record 
    str: string; 
    int: Integer; 
    bool: Boolean; 
    flt: Double; 
    end; 

var 
DataArray: Array[0..100] of TData; 

回答

11

只需使用超对象编组TSuperRTTIContext

program Project1; 

{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    superobject, 
    System.SysUtils; 

type 
    TData = record 
    str : string; 
    int : Integer; 
    bool : Boolean; 
    flt : Double; 
    end; 

    TDataArray = Array [0 .. 100] of TData; 

procedure Test; 
var 
    DataArray : TDataArray; 
    so :  ISuperObject; 
    ctx :  TSuperRttiContext; 
begin 
    ctx := TSuperRttiContext.Create; 
    try 
    so := ctx.AsJson<TDataArray>(DataArray); 
    finally 
    ctx.Free; 
    end; 
    Writeln(so.AsJson); 
end; 

begin 
    try 
    Test; 
    except 
    on E : Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

    ReadLn; 

end. 
+0

SuperObject的帮助文件有这个确切的例子(也许不是相同的代码,但与RTTI相同的概念) – 2013-03-15 15:34:57

+0

@JerryDodge也许因为这是要走的路?如果这种情况被记录,为什么它会不同? – 2013-03-15 15:56:23

+1

我没有说它应该是不同的,我只是说,因为OP可以简单地阅读库中附带的SuperObject的帮助文件,而不是在这里问。那里已经解释了完全相同的解决方案。 – 2013-03-15 16:08:21

3

首先将其设为字符串。

Your array: 
//Array[0] := 'Apple'; 
//Array[1] := 'Orange'; 
//Array[2] := 'Banana'; 
myArrayAsStr := '"MyArray": [{ "1": "' + Array[0] +'", "2": "' + Array[1] +'"}'; 

然后,你可以让它变成JSON与SO(myArrayAsStr) 您可以随时生成您的阵列在不同的程序字符串,但我认为是这样做的方式。

虐待继续检查,如果有一个更简单的方法;)

编辑: 超对象还具有以下功能: function SA(const Args: array of const): ISuperObject; overload; 您可以到再次转换为字符串,并在总JSON添加它串。

+0

有趣的方式.. – user299323 2013-03-15 10:48:28

+0

只是要注意:结果' “MYARRAY”:[{ “1”: “苹果”, “2”: “橙色”} '是**不是**有效的JSON字符串。它应该是'{“MyArray”:[{“1”:“Apple”,“2”:“Orange”}]}或甚至是[{“1”:“Apple”,“2” }]' – 2013-03-19 12:22:25

+0

啊右...哎呀..我的坏:P – 2013-03-19 13:01:08