【问题标题】:Delphi webservice JSON arrayDelphi 网络服务 JSON 数组
【发布时间】:2011-06-21 02:16:17
【问题描述】:

我对 Delphi 很陌生,我正在做一个关于如何通过 delphi 输出 JSON 数组的实验。这对任何人来说都可能听起来很简单,但我就是不知道怎么做。我已经创建了一个简单的程序。

现在,我想做的是创建一个带有参数的命令/请求:

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 }

【问题讨论】:

  • 代码中没有出现“Hello”的地方。 ResultValue := TlkJSONlist.Create; 被执行 N 次,然后被覆盖。
  • 好的,谢谢。我已经有代码了。让我分享给大家。 :)

标签: json delphi arraylist delphi-2005


【解决方案1】:

我刚刚找到了正确的答案。代码如下:

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 创建 Web 服务请求。

【讨论】:

    【解决方案2】:

    首先,我认为您的问题中显示的 URI 已经被解码。您应该在 HTTP 协议中对 URI 参数进行编码。

    如果您想创建这种面向 HTTP 的 JSON 访问,请查看RESTful approach。它将帮助您不重新发明井,并且能够使您的服务器更适合 AJAX。

    那么你似乎使用third-party lkJSON Delphi library...所以你可以直接从它的作者或支持论坛获得帮助。

    从库的源代码中,您应该使用 TlkJSONlist 实例来处理来自 URI 输入和结果输出的 JSON 数组。

    【讨论】:

    • 是的,谢谢。我只知道 TlkJSONlist。但我不知道如何使用它...示例代码将不胜感激。
    • 也许可以去使用另一个文档更好且受支持的库,例如 progdigy.com/?page_id=6
    • 好的,谢谢。但我不能使用任何其他图书馆。 :) 也许我只需要弄清楚。我真的被困住了。 :)
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多