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}]"
}

ご覧のとおり、2 つのペアが含まれています。そのうちの 1 つは、この場合は 3 つのオブジェクト (オブジェクトの量は動的です) を持つ配列で、複数の「キー: 値」があります (これらは変化せず、常に同じ 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プロパティを確認して 3 ではなく 6226004 が返された場合は、ここに別の問題があることを示しています。私の推測では、あなたが思っているのTJSONArrayは、実際にはそのタイプではありません。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 に答える