Eine dynamische Ermittlung alle Namen aus dem JSON File wäre besser (flexibler) für mich.
Die Funktion ist mit mORMot umgesetzt und
nicht optimiert. Solange keine Millionen Datenobjekte vorliegen, sollte es schnell genug sein. Dafür lässt es sich sehr schnell umsetzen. Es werden folgende JSON Varianten verarbeitet: {"Value": "value1"} und [{"Value": "value1"},{"Value": "value2"}].
Delphi-Quellcode:
uses
mormot.core.base,
mormot.core.data,
mormot.core.text,
mormot.core.json,
mormot.core.unicode,
mormot.core.variants,
mormot.core.os;
procedure GetFieldNames(const pmcData: Variant; pmpFieldNames: PRawUtf8DynArray; const pmcFilterFields: array of RawUtf8);
var
i: Integer;
run: PDocVariantData;
fieldName: RawUtf8;
begin
SetLength(pmpFieldNames^, 0);
case _Safe(pmcData)^.Kind of
dvObject:
run := _Safe(pmcData);
dvArray:
run := _Safe(TDocVariantData(pmcData).Value[0]);
else
Exit; //=> dvUndefined
end;
for i := 0 to High(run.Names) do
begin
fieldName := run.Names[i];
if FindPropName(pmcFilterFields, fieldName) < 0 then
AddRawUtf8(pmpFieldNames^, fieldName, True, False);
end;
end;
var
i, n: Integer;
value: Variant;
jsonData: Variant;
jsonDataCount: Integer;
fieldNames: TRawUtf8DynArray;
begin
if not TDocVariantData(jsonData).InitJsonFromFile('JsonData.json', JSON_OPTIONS_FAST_EXTENDED) then Exit; //=>
GetFieldNames(jsonData, @fieldNames, ['DasWillIchNicht']);
if Length(fieldNames) = 0 then Exit; //=>
if TDocVariantData(jsonData).Kind = dvArray then
jsonDataCount := TDocVariantData(jsonData).Count
else
jsonDataCount := 1;
for i := 0 to jsonDataCount - 1 do
begin
for n := 0 to High(fieldNames) do
begin
if jsonDataCount = 1 then
value := TDocVariantData(jsonData).Value[fieldNames[n]]
else
value := _Safe(TDocVariantData(jsonData)[i])^.Value[fieldNames[n]];
WriteLn(value);
end;
end;
end;
Bis bald...
Thomas