示例JSON:
[{"steward":"EMPL-0102","description":"Elish Guage","emplyear":"2001","emplmonth":"Nov","empl":"HOME","perhour":"50"},
{"steward":"EMPL-9002","description":"Bush Harcourt","emplyear":"1990","emplmonth":"Nov","empl":"HOME","perhour":"50"},
{"steward":"EMPL-0102","description":"John Long","emplyear":"2001","emplmonth":"Nov","empl":"OFFICE","perhour":"50"},
{"steward":"EMPL-9002","description":"Wensel Gold","emplyear":"1990","emplmonth":"Nov","empl":"OFFICE","perhour":"50"}]
我需要一步一步的可行Delphi代码段将从PHP网站收到的JSON数据转换为本地数据库表。我曾尝试阅读一些文件,但无法理解我的要求的正确实施。
我从我的网站收到了JSON数据,并希望将这些数据解析到我的本地表中 我希望评估JSON记录字段,例如表格格式(列和行) 我真的很喜欢它
FieldByName('field').AsString = JSONFieldByName('steward').AsString
然后到下一个JSON数组记录。
答案 0 :(得分:5)
如果没有实际的代码和数据,很难过于具体,但这是一个大致的想法。此示例使用DWS中的dwsJSON
库,但基本原则应与其他JSON实现一起使用。它假定您有一个由JSON对象组成的JSON数组,每个JSON对象只包含数据集的有效名称/值对。
procedure JsonToDataset(input: TdwsJSONArray; dataset: TDataset);
var
i, j: integer;
rec: TdwsJSONObject;
begin
for i := 0 to input.ElementCount - 1 do
begin
rec := input.Elements[i] as TdwsJSONObject;
dataset.Append;
for j := 0 to rec.ElementCount - 1 do
dataset[rec.names[j]] := rec.Values[j].value.AsVariant;
dataset.Post;
end;
//at this point, do whatever you do to commit data in this particular dataset type
end;
正确的验证,错误处理等留给读者练习。
答案 1 :(得分:1)
以下代码更具体到您的示例。即使您的需求发生变化,您也可以使用此代码中使用的JSON功能。 在这个字符串列表数组中包含(键,值)对。每个字符串在JSON对象中包含一个记录。您可以使用数组索引进行引用。
procedure ParseJSONObject(jsonObject : TJSONObject);
var
jsonArray : TJSONArray;
jsonArrSize,
jsonListSize : Integer;
iLoopVar,
iInnLoopVar : Integer;
recordList : array of TStringList;
begin
jsonArrSize := jsonObject.Size;
SetLength(recordList, jsonArrSize);
for iLoopVar := 0 to jsonArrSize - 1 do
begin
recordList[iLoopVar] := TStringList.Create;
jsonArray := (jsonObject.Get(iLoopVar)).JsonValue as TJSONArray;
jsonListSize := jsonArray.Size;
for iInnLoopVar := 0 to jsonListSize - 1 do
begin
ParseJSONPair(jsonArray.Get(iInnLoopVar), recordList[iLoopVar]);
end;
end;
end;
procedure ParseJSONPair(ancestor: TJSONAncestor; var list : TStringList);
var
jsonPair : TJSONPair;
jsonValue : TJSONValue;
jsonNumber : TJSONNumber;
keyName : String;
keyvalue : String;
begin
if ancestor is TJSONPair then
begin
jsonPair := TJSONPair(ancestor);
keyName := jsonPair.JsonString.ToString;
if jsonPair.JsonValue is TJSONString then
keyValue := jsonPair.JsonValue.ToString
else if jsonPair.JsonValue is TJSONNumber then
begin
jsonNumber := jsonPair.JsonValue as TJSONNumber;
keyvalue := IntToStr(jsonNumber.AsInt);
end
else if jsonPair.JsonValue is TJSONTrue then
keyvalue := jsonPair.JsonValue.ToString
else if jsonPair.JsonValue is TJSONFalse then
keyvalue := jsonPair.JsonValue.ToString;
end;
list.Values[keyName] := keyvalue;
end;