bpr*_*mas 7 sql delphi json datasnap
我有一个JSON对象,让我们将它命名为jObject,如下所示:
{
"id": 0,
"data": "[{DAT_INCL: \"08/03/2012 10:07:08\", NUM_ORDE: 1, NUM_ATND: 1, NUM_ACAO: 2, NUM_RESU: 3},
{DAT_INCL: \"08/03/2012 10:07:09\", NUM_ORDE: 2, NUM_ATND: 1, NUM_ACAO: 4, NUM_RESU: 5},
{DAT_INCL: \"08/03/2012 10:07:09\", NUM_ORDE: 3, NUM_ATND: 1, NUM_ACAO: 8, NUM_RESU: NULL}]"
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它包含两对,其中一个是一个数组,在这种情况下有三个对象(对象的数量是动态的),有多个"key:values"(这些不变,总是相同的5个字段),我想插入到SQL数据库中,"key"是列,"value"是字段.问题是,如何单独访问每个对象?
我所做的代码是通过将它放在jPair中来提取包含该数组的对
jPair := OriginalObject.Get(1);
Run Code Online (Sandbox Code Playgroud)
然后捕获数组
jArray:= TJSONArray(jPair.JsonValue);
Run Code Online (Sandbox Code Playgroud)
(另外,作为奖励,当我评估jArray.Size时,结果是6226004.什么?)
如果你有一个来自DBXJSON的数组,那么它就是一个TJSONArray.调用它的Get方法来获取数组的元素.
var
Value: TJSONValue;
Value := jArray.Get(0);
Run Code Online (Sandbox Code Playgroud)
您还可以通过for循环遍历整个数组:
for Value in jArray do
Run Code Online (Sandbox Code Playgroud)
但是如果你检查Size房产并获得6226004而不是3,这表明这里还有其他问题.我的猜测是你认为的TJSONArray不是那种类型.使用as做了检查类型转换:
jArray := jPair.JsonValue as TJSONArray;
Run Code Online (Sandbox Code Playgroud)
EInvalidCast如果失败,你会得到一个例外.
这是一个解析和输出json数据的示例代码.我修改了你的JSON数据并添加了ArrayData字段,它包含你的初始对象数组:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, dbxjson;
const JSON_DATA = '{"ArrayData":['+
'{"DAT_INCL":"07/03/2012 17:33:03", "NUM_ORDE":1,"NUM_ATND":1, "NUM_ACAO":2, "NUM_RESU":3},'+
'{"DAT_INCL":"07/03/2012 17:33:05", "NUM_ORDE":2,"NUM_ATND":1, "NUM_ACAO":4, "NUM_RESU":5},'+
'{"DAT_INCL":"07/03/2012 17:33:05", "NUM_ORDE":3,"NUM_ATND":1, "NUM_ACAO":8, "NUM_RESU":null}'+
']}';
var jsv : TJsonValue;
originalObject : TJsonObject;
jsPair : TJsonPair;
jsArr : TJsonArray;
jso : TJsonObject;
i : integer;
begin
try
//parse json string
jsv := TJSONObject.ParseJSONValue(JSON_DATA);
try
//value as object
originalObject := jsv as TJsonObject;
//get pair, wich contains Array of objects
jspair := originalObject.Get('ArrayData');
//pair value as array
jsArr := jsPair.jsonValue as TJsonArray;
writeln('array size: ', jsArr.Size);
//enumerate objects in array
for i := 0 to jsArr.Size - 1 do begin
writeln('element ', i);
// i-th object
jso := jsArr.Get(i) as TJsonObject;
//enumerate object fields
for jsPair in jso do begin
writeln(' ', jsPair.JsonString.Value, ': ', jsPair.JsonValue.Value);
end;
end;
finally
jsv.Free();
readln;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)