2013-03-15 118 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