【问题标题】:Parsing Datasnap result using JavaScript使用 JavaScript 解析 Datasnap 结果
【发布时间】:2014-07-07 14:13:01
【问题描述】:

我正在尝试将 Delphi 中的数据列表返回到列表框,但我认为我无法掌握它们如何组合在一起的基本原理。

answer 为我提供了一个使用本地定义数据集的工作示例。

我现在遇到的问题是我的 Delphi 代码返回的 JSON 对象的结构。

在上述答案中,对象中只有 1 个“层”数据:

resultJSON = '{"1":"Firm 1","2":"Firm 2","3":"Firm 3"}';

但是我的 Delphi 代码似乎增加了一层。 查询如下:

function TServerMethods1.GetFirms(jobnumb: string): TJSONObject;
var
   jso: TJSONObject;
begin
   jso := TJSONObject.Create();
   GetJobFirmList(jobnumb);
   with SQLQuery1 do
      while not Eof do
      begin
         jso.AddPair(TJSONPair.Create(FieldByName('firmref').AsString,
                                  FieldByName('firmnaem').AsString));
         Next;
      end;
   Result := jso;
end;

这将返回以下结果格式:

 {"result":[{"1":"Firm 1","2":"Firm 2","3":"Firm 3"}]}

我要么需要减少方括号外的代码,要么了解如何更好地迭代关卡。

这个answer here 展示了如何以相似的结构解析两个层,但我能想出的最好的整合两者的方法是以下失败:

function getJobFirms()
{
  var sel = $("#FirmList");
  sel.empty();
  var resultJSON = '{"result":[{"1":"Firm 1","2":"Firm 2","3":"Firm 3"}]}';
  var result = $.parseJSON(resultJSON);
  $.each(result, function() {      
    $.each(result.result, function(k,v) {
      var opt = document.createElement('option');
      opt.value = k;
      opt.text = v;
      sel.append(opt);
     });
  });
}

【问题讨论】:

    标签: javascript jquery json delphi datasnap


    【解决方案1】:

    正如您所说,您似乎错误地迭代了 JSON 结构。也就是说,result.result 是一个数组,所以你可以试试这样:

    function getJobFirms()
    {
        var sel = $("#FirmList");
        sel.empty();
        var resultJSON = '{"result":[{"1":"Firm 1","2":"Firm 2","3":"Firm 3"}]}';
        var result = $.parseJSON(resultJSON);
        $.each(result.result, function(i, resultItem) {
            $.each(resultItem, function(k, v) {
                var opt = document.createElement('option');
                opt.value = k;
                opt.text = v;
                sel.append(opt);
            });
        });
    }
    

    另外,如果result.result 数组中只有一个元素,则可以进一步减少代码:

    function getJobFirms()
    {
        var sel = $("#FirmList");
        sel.empty();
        var resultJSON = '{"result":[{"1":"Firm 1","2":"Firm 2","3":"Firm 3"}]}';
        var result = $.parseJSON(resultJSON);
        $.each(result.result[0], function(k, v) {
            var opt = document.createElement('option');
            opt.value = k;
            opt.text = v;
            sel.append(opt);
        });
    }
    

    【讨论】:

    • 由于某种原因它不喜欢 parseJSON - 添加一个额外的 $.each 循环可以让我到达我需要的地方。只需要了解为什么 Delphi/Datasnap 会以这种格式返回...
    • 我不确定我是否理解。以上应该适用于您的情况,尤其是当您的示例中的第一个 for 循环似乎没有做任何事情时。此外,如果您通过result.result[0] 迭代(仅内部循环),如果这对您有用,您可以进一步减少代码。
    • 为另一个例子编辑。
    • 感谢@miloss 的示例。它们都在从服务器返回的 JSON 集上工作 - 但是还有另一个函数(它带有特定的 Delphi 示例,用于从服务器获取 JSON) - 必须破坏 JSON,以便 ParseJSON 不喜欢它。
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多