2014-02-13 3 views
0

Пример JSON: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 врезку для преобразования данных в формате JSON, полученные с веб-сайта PHP для локальной таблицы базы данных. Я пробовал читать некоторые документы, но не мог понять правильную реализацию моего требования.

Я получил данные JSON с моего сайта и хочу разобрать эти данные в моем локальном столе.
Я хочу осваивать поля записи JSON, например, в виде таблицы (столбец и строки).
я действительно хотел, чтобы он похож на

FieldByName('field').AsString = JSONFieldByName('steward').AsString 

затем к следующей записи массива JSON.

ответ

5

Трудно получить слишком конкретную информацию без фактического кода и данных, чтобы посмотреть, но вот общая идея. В этом примере используется библиотека dwsJSON от DWS, но основные принципы должны работать с другими реализациями 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

Следующий код более конкретно относится к вашему примеру. Вы можете использовать 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; 
Смежные вопросы