【问题标题】:What's wrong with this assignment of json object from php to javascript?将 json 对象从 php 分配到 javascript 有什么问题?
【发布时间】:2010-11-25 11:20:42
【问题描述】:

我需要将 php json 对象的值传递给 javascript。我就是这样做的;

  <script type="text/javascript"> var msg_top = <?php echo searchResults('windows');?>;
  </script>

这是返回 json 的 php SearchResults 函数:

   function searchResults($q) {

      $host = "http://search.twitter.com/search.atom?q=" . urlencode( $q ) . "&rpp=100";
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $host);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    //Raw xml
      $result = curl_exec($ch);
      curl_close($ch);
      $xml = simplexml_load_string($result);
      return json_encode($xml);
      } 

错误控制台中没有错误,但没有收到任何值。它输出类似于 array(0) { } for var_dump($_POST); 编辑 我在成功功能后添加了一个测试警报,它打印出失败

这是脚本

  <head>
  <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js">
  </script>
  </head>
  <body>
  <script type="text/javascript"> var msg_top = <?php echo searchResults('windows');?>;
  </script>
  <script type="text/javascript">
    $(document).ready(function() 
    {
       $.ajax({
       url: "script.php",
       type: "POST",
       dataType: "json",
       data: "msg_top",
       success: function(msg){
       alert("success");
     }
   });
   alert("failure");
  });
  </script>
  </body>
  </html>

这是来自推特的 json

    <script type="text/javascript"> var test_json = {\"id\":\"tag:search.twitter.com,2005:search\\/#DIYSe_F\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/search.twitter.com\\/search?q=%23DIYSe_F\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"application\\/atom+xml\",\"href\":\"http:\\/\\/search.twitter.com\\/search.atom?q=%23DIYSe_F&rpp=100\",\"rel\":\"self\"}},{\"@attributes\":{\"type\":\"application\\/opensearchdescription+xml\",\"href\":\"http:\\/\\/search.twitter.com\\/opensearch.xml\",\"rel\":\"search\"}},{\"@attributes\":{\"type\":\"application\\/atom+xml\",\"href\":\"http:\\/\\/search.twitter.com\\/search.atom?q=%23DIYSe_F&rpp=100&since_id=7750301532557312\",\"rel\":\"refresh\"}}],\"title\":\"#DIYSe_F - Twitter Search\",\"updated\":\"2010-11-24T22:20:44Z\",\"entry\":[{\"id\":\"tag:search.twitter.com,2005:7559269595488256\",\"published\":\"2010-11-24T22:20:44Z\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/twitter.com\\/_smir\\/statuses\\/7559269595488256\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"image\\/png\",\"href\":\"http:\\/\\/s.twimg.com\\/a\\/1289849896\\/images\\/default_profile_5_normal.png\",\"rel\":
    \":\"image\"}}],\"title\":\"#DIYse_F HIE_STRUCT: HIERARCHICAL STRUCTURE: hierarchical structure to display \\nmessages of Functions and Qualities types\",\"content\":\"<a href=\\\"http:\\/\\/search.twitter.com\\/search?q=%23DIYse_F\\\" onclick=\\\"pageTracker._setCustomVar(2, \'result_type\', \'recent\', 3);pageTracker._trackPageview(\'\\/intra\\/hashtag\\/#DIYse_F\');\\\"><b>#DIYse_F<\\/b><\\/a> HIE_STRUCT: HIERARCHICAL STRUCTURE: hierarchical structure to display \\nmessages of Functions and Qualities types\",\"updated\":\"2010-11-24T22:20:44Z\",\"author\":{\"name\":\"_smir (Smeer)\",\"uri\":\"http:\\/\\/twitter.com\\/_smir\"}},{\"id\":\"tag:search.twitter.com,2005:7552659368189952\",\"published\":\"2010-11-24T21:54:28Z\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/twitter.com\\/_smir\\/statuses\\/7552659368189952\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"image\\/png\",\"href\":\"http:\\/\\/s.twimg.com\\/a\\/1289849896\\/images\\/default_profile_5_normal.png\",\"rel\":\"image\"}}],\"title\":\"#DIYse_F SEND_MSG: users can send messages of four types i.e.  \\n\\nFunction,Quality,Solution, and delivery\",\"content\":\"<a href=\\\"http:\\/\\/search.twitter.com\\/search?q=%23DIYse_F\\\" onclick=\\\"pageTracker._setCustomVar(2, \'result_type\', \'recent\', 3);pageTracker._trackPageview(\'\\/intra
\\/hashtag\\/#DIYse_F\');\\\"><b>#DIYse_F<\\/b><\\/a> SEND_MSG: users can send messages of four types i.e.  \\n\\nFunction,Quality,Solution, and delivery\",\"updated\":\"2010-11-24T21:54:28Z\",\"author\":{\"name\":\"_smir (Smeer)\",\"uri\":\"http:\\/\\/twitter.com\\/_smir\"}},{\"id\":\"tag:search.twitter.com,2005:7548895705956352\",\"published\":\"2010-11-24T21:39:31Z\",\"link\":[{\"@attributes\":{\"type\":\"text\\/html\",\"href\":\"http:\\/\\/twitter.com\\/Babar_Shahzad\\/statuses\\/7548895705956352\",\"rel\":\"alternate\"}},{\"@attributes\":{\"type\":\"image\\/png\",\"href\":\"http:\\/\\/a1.twimg.com\\/profile_images\\/1090185625\\/29465_391454998679_533808679_3864564_6071800_n_normal.jpg\",\"rel\":\"image\"}}],\"title\":\"#DIYse_F READ_MSG: Users can read messages of all four types in  \\n\\ndifferent windows\",\"content\":\"<a href=\\\"http:\\/\\/search.twitter.com\\/search?q=%23DIYse_F\\\" onclick=\\\"pageTracker._setCustomVar(2, \'result_type\', \'recent\', 3);pageTracker._trackPageview(\'\\/intra\\/hashtag\\/#DIYse_F\');\\\"><b>#DIYse_F<\\/b><\\/a> READ_MSG: Users can read messages of all four types in  \\n\\ndifferent windows\",\"updated\":\"2010-11-24T21:39:31Z\",\"author\":{\"name\":\"Babar_Shahzad (Babar Shahzad Ch)\",\"uri\":\"http:\\/\\/twitter.com\\/Babar_Shahzad\"}}]};

【问题讨论】:

  • 这需要基本的调试。 curl请求是否有效? $xml 包含什么?
  • @Pekka,是的,我在 ajax 之前添加了一点 php 测试块并检查了 curl 返回结果,并且还从jsonlint.com 验证了返回的 json 是有效的。 xml 包含推文数据,如消息、消息 ID、作者->姓名等。
  • 我会将传递给 JSON.parse() 的结果保存在 var 中。并使用 firebug 和 jsonlink 调试该 var 的值。所以像 var testJson = "";调试; var msg_top = JSON.parse(testJson) ;
  • @james,一旦我在 testJson 中保存了值,之后该做什么来进行 firbug 和 jsonlink 测试。我已经在 var msg_top 中有值。

标签: php javascript json urlencode decode


【解决方案1】:

如果您使用json_encode 将数据编码为 JSON,则输出将已经是有效的 JavaScript 表达式。所以你不需要把它放在引号里。

实际上,在其上应用addslashes 会将有效的 JavaScript 表达式转换为包含该 JavaScript 表达式的字符串:

$json = json_encode(array('foo'=>'bar'));
var_export($json);  // '{"foo":"bar"}'
$string = addslashes($json);
var_export($str);   // '{\\"foo\\":\\"bar\\"}'

在 JavaScript 中使用这些值时,$json 将包含一个有效的对象表达式,而$str 将包含一个字符串表达式:

var json = <?php echo $json; ?>,
    str = "<?php echo $str; ?>";

这将变成:

var json = {"foo":"bar"},
    str = "{\"foo\":\"bar\"}";

所以只需使用json_encode 而不应用任何进一步的编码/转义。在你的情况下(searchResults 确实已经返回了一个 JSON 字符串):

var test_json = <?php echo searchResults('windows'); ?>;

【讨论】:

  • @XCeptable : 请再次检查,如果不先将 PHP simplexml 对象转换为 javascript 格式(在这种情况下为 JSON),则无法将其传递给 javascript
  • @ajreal: json_encode 将首先将该对象转换为字符串(toString 方法)。但我不确定那个输出是什么样子的。
  • @ajreal,php 函数将它作为 json 返回,如 return json_encode($xml);
  • @XCeptable:所以它确实返回了一个包含 HTML/XML 代码的字符串?
【解决方案2】:

如果 searchResults 函数还没有返回 JSON,那么json_encode() 会更简单,例如

<script type="text/javascript"> 
    var msg_top = <?php echo json_encode(searchResults('windows'));?>;
</script>

如果 searchResults 函数已经返回正确的 JSON,您应该能够直接分配输出,例如

<script type="text/javascript"> 
    var msg_top = <?php echo searchResults('windows');?>;
</script>

【讨论】:

  • 见我回答的第二部分。如果您真的 已经拥有 json,那么您不需要做太多事情就可以进入其中。也许您可以发布一个 searchResults() 返回的示例?
  • 实际上,这仍然没有帮助,因为它仍然没有向我们显示 searchResults() 正在输出什么。你必须先走,然后再跑;如果我们甚至不知道从 PHP 传递到 JS 的东西是什么,那么用 javascript 测试东西就是浪费时间。向我们展示 searchResults() 的输出。
  • 您希望如何查看输出?我使用循环从中得到两个输出。即像 "foreach ($xml->entry as $status) { $status->author->name.''.$status->content; } $status->author->name 输出一个像 'El Yobo' 这样的名字 $ status->content 输出推文的文本。
  • 我现在添加了控制台突出显示的实际输入,方法是在引发无效属性 id 错误时用此替换 php 搜索功能行
  • 查看gumbo的回复,他解释的和我原来的帖子一样详细。
猜你喜欢
  • 2016-08-10
  • 2015-07-07
  • 2014-07-08
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2014-06-26
相关资源
最近更新 更多