编辑:我已经收到了这个问题的“着名问题”徽章,所以我想我会回到它并坚持发生在我身上的事情搜索它以立即得到答案。
基本上,我是JSON的新手。 JSON是一个对象(显然),因为它包含各种东西!所以我就像“嘿,javascript,只是弹出一个包含所有这些JSON数据的警报”,期望它能够将JSON数据作为字符串给我。但javascript不会这样做(这很好!),所以它就像“嘿,这就是我们显示对象的方式,[object Object]”。
我能做的就像alert(obj.DATA[0][1])
一样,它会向我展示那个对象。
我真正想要的是验证我是否制作了良好的JSON数据,我可以使用JSON.stringify
进行检查。
无论如何,回到我们定期安排的问题!
我正在尝试使用ajax调用获取一些JSON数据,但jQuery似乎不喜欢我的JSON。
如果我这样做:
function init2() {
alert("inside init2");
jQuery.ajax({
url: "/Mobile_ReportingChain.cfm",
type: "POST",
async: false,
success: function (data) {
alert(data);
var obj = jQuery.parseJSON(data);
alert(obj);
}
});
}
我从警报(数据)获取此信息:
{"COLUMNS":["MFIRST_NAME","MLAST_NAME","MMDDL_NAME","MEMPLY_ID","MAIM_NBR","EMPLY_ID"],
"DATA":[
["FNAME1 ","LNAME1 ","MI1 ","000-14-7189","026-0010","000-62-7276"]
,["FNAME2 ","LNAME2 ","MI2 ","000-01-2302","101-1850","000-14-7189"]
,["FNAME3 ","LNAME3 ","MI3 ","000-91-3619","102-1000","000-01-2302"]
,["FNAME4 ","LNAME4 ","MI4 ","000-25-9687","102-1000","000-91-3619"]
]}
JSONLint说的是有效的json。 alert(obj)给了我这个,但是:
[object Object]
添加dataType: "json"
或"text json"
只需在[object Object]
报告alert(data)
。
我真的很想弄明白这一点,有谁知道为什么会这样做?我是jQuery的新手,我的目标是为每个列获取一个数组。我正在使用的相同代码在一个看起来像的不同页面上工作,这最让我困扰的是。
答案 0 :(得分:34)
alert()
功能只能显示一串文字。作为唯一的参数,它需要一个字符串或一个对象。 然而,该对象将被转换为可以显示的字符串。
通过jQuery获取JSON时,$.ajax()
方法将自动解析JSON并将其转换为JavaScript对象。您的data
变量就是一个JavaScript对象,而不是人们所期望的JSON字符串。
由于alert()
只能显示字符串,因此在尝试提醒data
对象时,您的对象将变为其字符串表示形式。 JavaScript对象的字符串表示形式为[object Object]
。
出于调试目的,您可以使用console.log(data)
代替。然后,您可以通过浏览器开发人员工具中的控制台检查对象及其内容。
function init2() {
jQuery.ajax({
url: "/Mobile_ReportingChain.cfm",
type: "POST",
dataType: "json",
async: false,
success: function (data) {
console.log(data);
}
});
}
如果由于某种原因仍然想要提醒JSON数据,那么您必须将data
对象重新转换为JSON字符串。为此,您可以使用JSON.stringify
:
alert(JSON.stringify(data));
答案 1 :(得分:11)
它想要一个字符串
var obj = $.parseJSON(JSON.stringify(data));
答案 2 :(得分:4)
尝试将该对象发送到console.log
。你会更清楚地了解它包含的内容。
另外,放dataType: 'json'
并删除parseJSON
,因为它们都是一样的。
答案 3 :(得分:2)
这是应该如何工作的。您的JSON成为javascript对象。然后,您可以将该对象作为常规javascript对象进行操作。
例如, data.COLUMNS
应该返回一个数组。
答案 4 :(得分:2)
[object Object]
是javascript对象的字符串表示形式。
尝试访问对象的属性。
alert(data.COLUMNS[0]);
答案 5 :(得分:2)
jQuery.parseJSON
会将json字符串转换为json对象,因此alert(obj)会显示[object Object]
,因为它是一个对象。
如果您想查看obj
包含的内容,请使用console.log(obj)
,然后查看控制台日志消息。
答案 6 :(得分:0)
$.getJSON( "UI/entidades.json.php", function(data){
result = JSON.stringify(data);
alert(result)
console.log(result)
})
答案 7 :(得分:0)
(我知道这是一个 jquery 问题;但请耐心等待我一分钟,这样我就可以解释为什么我首先会遇到这个问题)。 我想填补空白,删除了我的 MySQL 表中的记录(主键是自动递增的。所以当我的 id 之间删除的记录缺少键时。我虽然有一些机制来显示这些缺失的键。所以我创建了通过循环创建数组的代码然后删除了那些存在的键并回显了该数组(当然是 json_encode 那个数组)。 但令我惊讶的是,我所做的一切最终都会给我 [object Object]。 这让我很困惑,这就是问题所在。
解决方案:只需重新排列阵列,我的所有问题都消失了。
下面我会举一个简单的例子。
<!DOCTYPE html>
<html>
<head>
<script src="../js/jquery/jquery3.x/jquery-3.3.1.min.js"></script>
<title></title>
<script type="text/javascript">
$(function () {
$('#generate').click(function () {
$.get('tmp2.php?tab=1', function (data) {
var retStr = '<table>';
var par = $.parseJSON(data);
$(par).each(function () {
retStr += '<tr><td>' + this + '</td></tr>';
});
retStr += '</table>';
$('#res').html(retStr);
});
});
});
</script>
</head>
<body>
<input type="button" value="generate" id="generate" />
<div id="res"></div>
</body>
</html>
和控制器
<?php
if (!empty($_GET['tab'])) {
$ids = array();
for ($i = 0; $i < 50; $i++)
$ids[] = $i;
for ($i = 0; $i < 50; $i = $i + 2)
unset($ids[$i]);
// echo json_encode($ids); // this will generate [object Object]
$res = array();
foreach ($ids as $key => $value) {
$res[] = $value;
}
echo json_encode($res);
exit();
}
?>