php中接收到的JSON数据格式不完整



我正在构建一个超级简单的网站应用程序,该应用程序调用API来检索用户输入到所述应用程序中的任何网站的反向链接数据。API发送的数据包括字符串(例如。http://www.domain.com/?feed=rss)和数字,并且是JSON格式。我将响应解析如下:

mozResponse = JSON.parse(response);

然后,我迭代这些数据,只将我想要的数据推入2个新数组(arry,arry1),声明如下:

arry = []; 
arry1 = [];

推送如下:

arry.push({id:i, url:mozResponse[i].uu, pa:Math.round(mozResponse[i].upa), da:Math.round(mozResponse[i].pda), anchor:mozResponse[i].lt});

然后,我将这两个数组字符串化如下:

var cautionArrayString = JSON.stringify(arry);
var dangerArrayString = JSON.stringify(arry1);

我使用JavaScriptXMLHTTPRequest将这些数据POST到php文件中,如下所示:

var queryString = "email=" + Email + "&caution=" + cautionArrayString + "&danger=" + dangerArrayString;
xhr1.onreadystatechange=Response1;
xhr1.open("post","http://example.com/emails.php",true);
xhr1.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr1.send(queryString);

php文件随后显示:

$caution = $_POST['caution']; 
$danger = $_POST['danger']; 

我知道在这一点上,我应该在最初解码JSON时再次解码,这样我最终得到了一个损坏的数组。以下是console.log在将数据发布到php文件后读取的内容,php文件使用:

echo($_POST['caution']);
echo ($_POST['danger']);

控制台日志显示:

[{"id":3,"url":"example.ca/","pa":26,"da":12,"anchor”:”Example”},    
{"id":4,"url":"example.ca/","pa":26,"da":12,"anchor":"thank you gifts"},  
{"id":5,"url":"example.ca/","pa":26,"da":12,"anchor":"flowers"},
{"id":6,"url":"example.ca/","pa":26,"da":12,"anchor":"thank you"},
{"id":7,"url":"example.ca/","pa":26,"da":12,"anchor":"Arrive in Style"},
{"id":8,"url":"example.ca/","pa":26,"da":12,"anchor":"dignity"},
{"id":9,"url":"example.ca/","pa":26,"da":12,"anchor":"Beautiful in Blue"},
{"id":10,"url":"example.ca/","pa":26,"da":12,"anchor":"Blooming Garden Basket"},
{"id":11,"url":"example.ca/","pa":26,"da":12,"anchor":"Country Basket Blooms"},
{"id":12,"url":"example.ca/","pa":26,"da":12,"anchor":"Heart’s Delight"},
{"id":13,"url":"example.ca/","pa":26,"da":12,"anchor":"Make a Wish"},
{"id":14,"url":"example.ca/","pa":26,"da":12,"anchor":"Moondance"},
{"id":15,"url":"example.ca/","pa":26,"da":12,"anchor":"Queen’s Court"},
{"id":16,"url":"example.ca/","pa":26,"da":12,"anchor":"Sweet as Sugar"},
{"id":17,"url":"example.ca/","pa":26,"da":12,"anchor":"flower colors"},
{"id":18,"url":"example.ca/","pa":26,"da":12,"anchor":"Always Yours"},
{"id":19,"url":"example.ca/","pa":26,"da":12,"anchor":"Sunrise, Sunset"},
{"id":20,"url":"example.ca/","pa":26,"da":12,"anchor":"Uniquely Chic"},
{"id":21,"url":"example.com/best/index.php?page=1998","pa":25,"da":31,"anchor":"example.ca/"},
{"id":22,"url":"example.com/best/index.php?page=1994","pa":25,"da":31,"anchor":"example.ca/"},
{"id":23,"url":"example.ca/","pa":25,"da":16,"anchor”:”example”},
{"id":28,"url":"example.ca/article/156-best-cms-for-small-business","pa":22,"da":39,"anchor":"example.ca/"},
{"id":30,"url":"example.ca/blog.html","pa":21,"da":15,"anchor":"example.ca/"},
{"id":31,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor”:”Example”},
{"id":32,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor":"Arrive in Style"},
{"id":33,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor":"Beautiful in Blue"},
{"id":34,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor":"Blooming Garden Basket"},
{"id":35,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor":"Country Basket Blooms"},
{"id":36,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor":"Heart’s Delight"},
{"id":37,"url":"example.ca/beyond-the-flowers-choosing-a-vase/","pa":20,"da":12,"anchor":"Make a Wish"},
{"id":38,"url":"example.ca/gifts.html","pa":19,"da":11,"anchor”:”example- <span class="catlist"> Flowers</span>"},
{"id":39,"url":"example.ca/category/flowers/","pa":19,"da":16,"anchor”:”Example”},
{"id":40,"url":"example.ca/category/floral-fauna/","pa":19,"da":16,"anchor”:”Example”},
{"id":41,"url":"nunavut.findstuffhere.ca/nunavut/?feed=rss2[]

在末尾可以看到第一个数组是不完整的,第二个数组是空的(应该是空的!)。所以我的问题是,是什么导致了这种情况,我该如何解决?

需要注意的事项

  • 我使用3个URL作为测试输入。数据是完整的,有1个URL,但另外2个(包括上面的示例)返回了这个不完整的JSON,似乎是因为查询字符串是从API返回的URL的一部分
  • Iconsole.log(mozResponse),输出如预期
  • Iconsole.log(arry) and console.log(arry1)在迭代mozResponse并将数据从mozResponse推送到arry/arry1之后,输出是一个完整的数组
  • console.log(arry)console.log(arry1)在应用JSON.stringify之后,但在发布到php之前,输出完成

我探索过的东西

  • 我最初以为这是其中一个URL的结果API返回包含查询字符串(例如?feed=rss2,其中breaks),但是在此断点之前有查询字符串处理得很好
  • 似乎不像我使用的那样是JSON错误json_last_error();并且它返回0
  • 似乎也不是aJSON/POST字符限制,因为当我输入不同的URL(该URL的$_POST的输出在查询字符串后中断,不确定这是否是巧合)
  • Suhosin不在场
  • 创建了一个phpinfo页面来检查max_vars,但限制很大

非常感谢您的帮助!

*不同的引号来自复制/粘贴!

您可能只需要对值进行编码即可在查询字符串中使用:

var cautionArrayString = encodeURIComponent(JSON.stringify(arry));
var dangerArrayString = encodeURIComponent(JSON.stringify(arry1));
var queryString = "email=" + encodeURIComponent(Email) + "&caution=" + cautionArrayString + "&danger=" + dangerArrayString;

将其转换为json不会自动对其进行正确编码,以便在url中使用,因此值中的字符可能会破坏查询字符串。

假设不同的引号是由复制粘贴引起的。。。

最新更新