JSON-массив Delphi для веб-сервиса

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

Теперь я хочу создать команду / запрос с таким параметром:

http://localhost:8001/hello?json={"names":["Jay","Chris","John"]}

это создаст результат в браузере следующим образом:

{ result: ["Hello Jay","Hello Chris","Hello John"], id: "", time_elapsed: 0 }

Пожалуйста, мне действительно нужна помощь в этом. Кто-нибудь?

РЕДАКТИРОВАТЬ: Это код, который я только что сделал сегодня, но он все еще не показывает желаемый результат:

procedure TPrimeJSONMHelloPeople.ProcessJSONRPCRequest(
  var ResultValue: TlkJSONbase; var ResultSuccess: Boolean);
  var

    jsonPeople:TlkJSONlist;
    dmPool:TObject;
    dm:TPrimeDataModuleBaseDM;
    i:integer;

  begin
    FjsonObj1 := TlkJSONobject.Create;
    jsonPeople := FjsonObj1.CreateListValue('names');
    jsonPeople.AddVarString('jay');
    jsonPeople.AddVarString('ann');
    jsonPeople.AddVarString('john');
    inherited;

    CheckRequiredParameter('names');

    PrimeDataModuleWebService.TDataModuleDMCreateInstanceDefault(dmPool);
      try
         dm := TPrimeDataModuleDefaultDM(dmPool).GetModule;
         try

         //this part here will loop and output the name
         //if jsonPeople <> nil then

         if Params.Field['names'] <> nil then
           begin
             for i := 0 to FjsonObj1.Field['names'].Count - 1 do
             begin           
               ResultValue := TlkJSONlist.Create
             end;

         end;
       ResultValue := TlkJSONlist.Create;
       finally
       dm.Release;
      end;
    finally
  dmPool.Free;
 end;
   FjsonObj1.Free;
   ResultSuccess := True;
 end;

Я не знаю, чего не хватает в коде, он показывает только: {

result: [ ],
id: "",
time_elapsed: 0

}

и не:{ result: ["Hello Jay","Hello Chris","Hello John"], id: "", time_elapsed: 0 }

2 ответа

Решение

Я только что нашел правильный ответ. Вот код:

procedure TSample1.ProcessJSONRPCRequest(
  var ResultValue: TlkJSONbase; var ResultSuccess: Boolean);
  var

    dmPool:TObject;
    dm:TPrimeDataModuleBaseDM;

    jsonPeople:TlkJSONlist;    //used Tlkjsonlist since I want to create an array
    i:integer;
  begin
  inherited;
    jsonPeople:=TlkJSONlist.Create;  //create jsonPeople as an array

    CheckRequiredParameter('names'); //names parameter needed
    PrimeDataModuleWebService.TDataModuleDMCreateInstanceDefault(dmPool);
    try
      dm := TPrimeDataModuleDefaultDM(dmPool).GetModule;
      try
        if Params.Field['names'] <> nil then //check if the names parameter is empty
        begin
          ResultValue:=jsonPeople;
          for i := 0 to Params.Field['names'].Count - 1 do
          begin
            jsonPeople.AddVarString('hello ' + Params.Field['names'].Child[i].value);
          end;
        end;
      finally
        dm.Release;
      end;
    finally
    dmPool.Free;
  end;
  ResultSuccess := True;
end;

end.

Запрос http://localhost/sample1?json={"names":["john","jay"]}Выход

{

    -
    result: [
        "hello john"
        "hello jay"
    ]
    id: ""
    time_elapsed: 0

}

Надеюсь, что это может помочь новичку в создании запроса к веб-сервису с использованием delphi.

Прежде всего, я думаю, что ваш URI, показанный в вашем вопросе, уже расшифрован. Вы должны закодировать параметры URI в протоколе HTTP.

Если вы хотите создать такой HTTP-ориентированный доступ JSON, взгляните на подход RESTful. Это поможет вам не заново изобретать скважину и сможет сделать ваш сервер более готовым к AJAX.

Тогда вы, похоже, используете стороннюю библиотеку lkJSON Delphi... Так что вы можете получить прямую помощь от ее автора или форума поддержки.

Из исходного кода библиотеки вы должны использовать TlkJSONlist экземпляр для обработки массива JSON, как из ввода URI, так и из вывода результатов.

Другие вопросы по тегам