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, так и из вывода результатов.