JSON数据键值,object.keys错误



我试图从JSON数据中解析所有键。

<script type="text/javascript">
    $(document).ready(function () {
        $.ajax({
            type: "POST",
            url: "History.aspx/GetFTEData",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                var returnedstring = data.d;
                var colHeader = Object.keys(data[0]); <---- error line
            }
        });
    });
</script>

但是,var colHeader = Object.keys(data[0]);在我的IE 11或Firefox浏览器上使用我的IDE(VS2015)运行时,即使它在JSFiddle中起作用,也无法使用它: -

https://jsfiddle.net/qpu3cn5u/

错误消息:-0x800a138f -JavaScript运行时错误:object..keys:参数不是对象

我有什么选择?这样我只能将键作为我试图用值填充的HTML表的列名。

数据的示例: -

var data = `[{"Customer Name":"XXXX","1999":76.000,"2000":68.000,"2001":49.000,"2002":41.000,"2003":47.000,"2004":56.000,"2005":33.000,"2006":51.000,"2007":56.000,"2008":52.000,"2009":55.000,"2010":52.000,"2011":57.000,"2012":55.000,"2013":93.000,"2014":92.000,"2015":62.000,"2016":71.833},{"Customer Name":"YYYYY","1999":29.000,"2000":27.000,"2001":35.000,"2002":37.000,"2003":32.000,"2004":29.000,"2005":44.000,"2006":49.000,"2007":69.000,"2008":109.000,"2009":108.000,"2010":150.000,"2011":189.000,"2012":215.000,"2013":53.000,"2014":78.000,"2015":65.000,"2016":63.000},{"Customer Name":"ZZZZ","1999":0.000,"2000":0.000,"2001":0.000,"2002":0.000,"2003":0.000,"2004":0.000,"2005":0.000,"2006":0.000,"2007":0.000,"2008":0.000,"2009":0.000,"2010":0.000,"2011":0.000,"2012":28.000,"2013":36.000,"2014":59.000,"2015":90.000,"2016":94.000},{"Customer Name":"AAAAA","1999":0.000,"2000":0.000,"2001":0.000,"2002":0.000,"2003":0.000,"2004":0.000,"2005":0.000,"2006":0.000,"2007":0.000,"2008":0.000,"2009":0.000,"2010":0.000,"2011":0.000,"2012":18.000,"2013":18.000,"2014":18.000,"2015":19.000,"2016":18.000}]`

似乎问题是data[0]仍处于JSON状态。当您编码各个对象,然后编码其封闭数组时,这通常会发生。单个对象进行双重编码。

作为测试,请尝试以下操作:

var parsed = JSON.parse(data[0]);
console.log(Object.keys(parsed));

如果这显示了您想要的结果,则告诉您双重编码是问题。

但是,再次解析它不是解决方案。您需要在生成JSON数据的服务器上进行修复,以使其不会进行双重编码。

如果您必须支持较旧的浏览器,则可以随时尝试找到如何使用旧样式/API执行类似任务的示例。例如,您可以通过执行类似的操作来绕过Javascrip对象道具:

for (var property in object) {
    if (object.hasOwnProperty(property)) {
        // do stuff
    }
}

在此处找到的类似问题/代码示例。

但是,Object.keys()是支持所有主要浏览器。包括IE11,请参考。

相关内容

最新更新