8

我有一个 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}]"
}

如您所见,它包含两对,其中一对是在这种情况下具有三个对象的数组(对象的数量是动态的)具有多个“键:值”(这些不会变化,始终是相同的 5 个字段),我想将其插入到 SQL 数据库中,“键”是列,“值”是字段。问题是,我如何单独访问每个对象?

代码方面,我所做的是通过将包含该数组的对放入 jPair 中来提取它

jPair := OriginalObject.Get(1); 

然后捕获数组

jArray:= TJSONArray(jPair.JsonValue);

(另外,作为奖励,当我评估 jArray.Size 时,结果是 6226004。什么?)

4

3 回答 3

9

如果您有一个来自 DBXJSON 的数组,那么它是一个TJSONArray. 调用它的Get方法来获取数组的一个元素。

var
  Value: TJSONValue;

Value := jArray.Get(0);

您还可以通过for循环遍历整个数组:

for Value in jArray do

但是,如果您检查Size属性并得到 6226004 而不是 3,则表明这里还有其他问题。我的猜测是,您认为的 aTJSONArray并不是那种类型。用于as进行检查类型转换:

jArray := jPair.JsonValue as TJSONArray;

如果失败,你会得到一个EInvalidCast例外。

于 2012-03-07T21:20:31.593 回答
7

这是解析和输出 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.
于 2012-03-08T10:52:53.660 回答
1

将 JSON 数据从数组添加到 TComboBox 的实际示例

此示例假定您已包含 JSON 单元。它还假设您有一个名为 cmbCompany 的 TComboBox。接受的答案没有错,我只是想记录一下。

uses JSON;

procedure LoadCompanies;
var
  i : Integer;
  companyArray : TJsonArray;
  company : TJsonObject;

begin
  //get the company data
  companyData := TJSONObject.ParseJSONValue('{data:[{"name": "One"},{"name": "Two"}]}') as TJSONObject;
  try
    cmbCompany.Items.Clear;
    with companyData do
    begin
      //Important bit which relates to the question!
      companyArray := (Get('data').JsonValue as TJSONArray);
      try 
        for i := 0 to companyArray.Size-1 do
        begin
          //Get one of the array values
          company := (companyArray.Get(i) as TJSONObject);

          //Add name to combo box, you can obviously get other values in similar fashion
          cmbCompany.Items.Add(company.GetValue<String>('name'));
        end;
      finally
        companyArray.Free;
      end;
    end;
  finally
    companyData.Free;
  end;
end;
于 2021-12-29T11:19:40.403 回答