【问题标题】:How might I populate an object property using a JSON-encoded server response?如何使用 JSON 编码的服务器响应填充对象属性?
【发布时间】:2009-12-28 17:47:12
【问题描述】:

我怎样才能把这个变成:

<? echo json_encode($myArrays); ?>

...进入这个:

_rowData: [
    { name: "Most Recent", view: "recentView" }, 
    { name: "Most Popular", view: "popularView" }, 
    { name: "Staff Picks", view: "staffView" }
],

我的脚本返回那个 ^,但我不知道如何将数据放入字符串 _rowData 中? 附言我正在使用 Dashcode,试图将项目动态加载到列表控制器中

到目前为止,我有这个:

var recentListControllerXHR = $.ajax("http://tarnfeldweb.com/applewebapps/ajax/recentApps.php", function(data){
                            return(JSON.stringify(data));
                          }, 'text');

rowData: recentListControllerXHR,

【问题讨论】:

  • 好的,很好...现在,您是通过 AJAX (XMLHttpRequest) 从客户端脚本中检索此 JSON,还是将其直接嵌入到您的页面中?如果是前者,你会想要使用像 json.org/js.html 这样的库;如果是后者,其实可以直接写&lt;script&gt;var _rowData = '&lt;? echo json_encode($myArrays,JSON_HEX_APOS); ?&gt;'&lt;/script&gt;
  • 我知道:/ 但我正在 Dashcode 中构建一个 Web 应用程序 - 尝试将项目加载到列表控制器和 .js 文件中 - 所以现在直接使用 php :(
  • 嗯。好吧,我对 Dashcode 或可能产生的影响一无所知。不过,您可能应该将其包含在您的问题中。
  • 那么忽略它,无论如何它在一个 .js 文件中,所以没有内联 php 我需要通过 XHR 以某种方式复制底部代码块?
  • 仍然不太清楚你在问什么,但你可以使用我上面链接到的库提供的 JSON.parse()JSON.stringify() 函数来做到这一点。

标签: javascript jquery string json dashcode


【解决方案1】:

好的 - 您的问题似乎是对异步 API 的工作方式有误解。 $.ajax() 发出请求,在未来的某个时间调用提供的回调并返回响应。

假设您有一个要填充的对象的名称,您可以使用以下内容填写所需的属性:

var someObject = {
  ...
  rowData: null,
  ...
};

// at this point, someObject is incomplete...

$.getJSON("http://tarnfeldweb.com/applewebapps/ajax/recentApps.php", 
  function(data)
  {
    // called whenever the server gets around to sending back the data
    someObject.rowData = data;
    // at this point, someObject is complete.
  });

请注意,我在这里使用 jQuery 对 JSON 的内置支持。如果您愿意,您可以使用 json.org 库,但如果您在解析数据时没有任何异常需求,getJSON() 会相当方便。

【讨论】:

  • 是的,可能是总体上最好的答案。
  • 好的,我稍微修改了一下 - 加载指标和所有.. 但无论如何这次当我提醒 data 我得到 [Object object],[Object object],[Object object] 我假设现在是正确的?我会测试一下并告诉你
  • 嗯,这一直是我的困惑点——如果你正在寻找一个对象数组,这段代码是正确的(这就是你看到的打印出来的——如果你想使用 Firebug所有细节)。如果您真的想保留 JSON 字符串,您可以在原始代码中使用 $.ajax() - 但我无法想象您为什么想要这样。既然你已经接受了,我会认为它对你有用,并澄清你的标题以反映我的解释,但如果没有,请告诉我们......
  • 是的,效果很好!!我有一个与 DOM 相关的小问题并重新加载列表的数据,但这与这个问题无关,非常感谢!您有电子邮件吗,我想将您添加到应用程序的积分中 - 哈哈
【解决方案2】:

试试这个:

var rowData;
$.getJSON("http://tarnfeldweb.com/applewebapps/ajax/recentApps.php", function(data) {
    rowData = data;
});

但请注意rowData 在回调函数(参见getJSON 调用的第二个参数)被调用之前是不可用的。

【讨论】:

  • 我喜欢@Vincent Robert 说问题作者不理解 $.ajax 调用,然后通过证明他也不理解。至少有人真正知道如何使用它......
【解决方案3】:

基本上已经使用另一种方法回答了这个问题,但是,如果您有兴趣使用 $.ajax 方法而不是 $.getJSON 方法,您可以这样做:

var rowData;
$.ajax({
    url: "http://tarnfeldweb.com/applewebapps/ajax/recentApps.php",
    type: 'get',
    dataType: 'json' // could also be 'jsonp' if the call is going to another site...
    success: function(data){
        rowData = data; 
    }
});

只是另一种选择,仅此而已......

【讨论】:

    【解决方案4】:

    看起来你不明白 $.ajax 的工作原理(看起来没人懂)。

    $.ajax 是一个异步函数,这意味着它不返回任何内容。它只准备一个函数,以便稍后在接收到数据时调用。

    您的代码应该看起来更像这样:

    var obj = {
     ...
     _rowData: [],
     ...
    };
    
    $.getJSON("http://tarnfeldweb.com/applewebapps/ajax/recentApps.php", function(data)
    {
        // Now data contains your row data, 
    
        // you can either fill the global object
        obj._rowData = data;
        doSomethingWith(obj);
    
        // or use data directly
        doSomethingWith({
            ...
            _rowData: data
            ...
        });  
    });
    
    // Note that code below will be executed before the AJAX data is received
    

    【讨论】:

    • 不幸的是,您的代码不会将响应转换为 JSON 对象...它只是文本。
    • 编辑为应该与 JSON 响应一起使用的内容。请注意,Javascript 中没有 JSON 对象之类的东西。您可以从 JSON 字符串创建一个 Javascript 对象,看起来您的 _rowData 是一个 Javascript 对象。将 JSON 字符串转换为对象的这一部分应该由 jQuery 优雅地处理。
    【解决方案5】:

    您的函数将在成功响应时返回数据。 你已经声明了回调函数:

    function(data){
        return(JSON.stringify(data));
    }
    

    因此,“数据”将包含从请求返回的任何数据,如果您将内容类型声明为 text/json(或 application/json - 我不记得我的头脑)并且 将您的 JSON 呈现为响应中的文本,您应该很好。

    您可能想要做的是让您的函数将变量声明为 rowData 并从那里开始,所以请执行以下操作:

    function(rowData){
        // do something with the rowdata
    }
    

    我怀疑你是否需要 stringify 方法,除非你试图将数据写成文本。

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多