JSON到数据库表

时间:2014-02-13 16:34:02

标签: json delphi

示例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数组记录。

2 个答案:

答案 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;