使用JavaScript解析Datasnap结果

时间:2014-05-19 14:48:01

标签: javascript jquery json delphi datasnap

我正在尝试将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);
     });
  });
}

1 个答案:

答案 0 :(得分: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);
    });
}