JSON-массив веб-службы Delphi - PullRequest
0 голосов
/ 21 июня 2011

Я действительно новичок в 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 ]

1 голос
/ 24 июня 2011

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

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.

0 голосов
/ 21 июня 2011

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

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

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

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

...