【问题标题】:Error parsing JSON string using parseJSON使用 parseJSON 解析 JSON 字符串时出错
【发布时间】:2017-08-27 20:27:55
【问题描述】:

如果代码或数据本身存在问题,需要一些帮助。虽然我怀疑它与代码有关,因为我试图验证收到的 JSON 数据格式是否正确......

这是我的 JSON 数据

{"view":"cities","model":{"top10Cities":[{"id":1024,"name":"Mumbai (Bombay)","countrycode":"IND","district":"Maharashtra","population":"10500000"},{"id":2331,"name":"Seoul","countrycode":"KOR","district":"Seoul","population":"9981619"},{"id":206,"name":"São Paulo","countrycode":"BRA","district":"São Paulo","population":"9968485"},{"id":1890,"name":"Shanghai","countrycode":"CHN","district":"Shanghai","population":"9696300"},{"id":939,"name":"Jakarta","countrycode":"IDN","district":"Jakarta Raya","population":"9604900"},{"id":2822,"name":"Karachi","countrycode":"PAK","district":"Sindh","population":"9269265"},{"id":3357,"name":"Istanbul","countrycode":"TUR","district":"Istanbul","population":"8787958"},{"id":2515,"name":"Ciudad de México","countrycode":"MEX","district":"Distrito Federal","population":"8591309"},{"id":3580,"name":"Moscow","countrycode":"RUS","district":"Moscow (City)","population":"8389200"},{"id":3793,"name":"New York","countrycode":"USA","district":"New York","population":"8008278"}],"fusionCharts":{"chart":"{\"showValues\":\"0\",\"caption\":\"Cities by Country Code\",\"theme\":\"zune\"}","data":"[{\"label\":\"Mumbai (Bombay)\",\"value\":\"10500000\"},{\"label\":\"Seoul\",\"value\":\"9981619\"},{\"label\":\"São Paulo\",\"value\":\"9968485\"},{\"label\":\"Shanghai\",\"value\":\"9696300\"},{\"label\":\"Jakarta\",\"value\":\"9604900\"},{\"label\":\"Karachi\",\"value\":\"9269265\"},{\"label\":\"Istanbul\",\"value\":\"8787958\"},{\"label\":\"Ciudad de México\",\"value\":\"8591309\"},{\"label\":\"Moscow\",\"value\":\"8389200\"},{\"label\":\"New York\",\"value\":\"8008278\"}]"}},"cleared":false}

这是我用来接收 JSON 数据的代码

$(document).ready( function () {

    var jsonD = $.getJSON("http://localhost:8080/v1/cityData", function ( data ) {
        console.log("Success "+ data.toString());
        alert(data);

        $("#fChart").insertFusionCharts({
            type: "column2d",
            width: "450",
            height: "250",
            dateFormat: "JSONURL",
            dataSource: data
        });
    })

});

我尝试了article 中所述的提示,但仍然无法正常工作。关于如何解决这个问题的任何建议?谢谢

更新 2

按照 Nisanth 的建议修改了 jquery 代码,但图表库仍然无法正常工作。它说无效数据,也许这是融合图表库本身的问题?

    $(document).ready( function () {

var jsonD = {};

        $.getJSON("http://localhost:8080/v1/cityData", function ( data ) {

            console.log("Success ");
            alert(data);
            jsonD = data;

        }).done( function () {

            var fcData = JSON.stringify(jsonD);
            console.log("fcData: "+fcData);
            $("#fChart").insertFusionCharts({
                type: "column2d",
                width: "450",
                height: "250",
                dateFormat: "JSON",
                dataSource: fcData
            });
        });     
    });

代码运行良好,我在 .done 函数中添加了一个日志,它显示了 fcData 的值,如下所示。

更改 fcData = jsonD.model.fusionCharts 并收到以下错误。

Uncaught TypeError: b.match is not a function
    at Fb (fusioncharts.js:214)
    at constructor._drawCategory (fusioncharts.js:1263)
    at constructor._drawComponents (fusioncharts.js:1223)
    at constructor.draw (fusioncharts.js:1220)
    at k._drawAxis (fusioncharts.js:981)
    at k._updateVisuals (fusioncharts.js:976)
    at k.draw (fusioncharts.js:979)
    at k.init (fusioncharts.js:946)
    at Object.m.createChart (fusioncharts.js:875)
    at n.core.render (fusioncharts.js:1801)

更新 3

代码更新

    }).done( function () {          
        var cfChart= jsonD.model.fusionCharts.chart;
        var cfData= jsonD.model.fusionCharts.chart;
        $("#fChart").insertFusionCharts({
             type: "column2d",
             width: "450",
             height: "250",
             dateFormat: "JSON",
            dataSource: {chart:cfChart,data:cfData}
         });
    });     
});

错误日志

Uncaught TypeError: b.match is not a function
    at Fb (fusioncharts.js:214)
    at constructor._drawCategory (fusioncharts.js:1263)
    at constructor._drawComponents (fusioncharts.js:1223)
    at constructor.draw (fusioncharts.js:1220)
    at k._drawAxis (fusioncharts.js:981)
    at k._updateVisuals (fusioncharts.js:976)
    at k.draw (fusioncharts.js:979)
    at k.init (fusioncharts.js:946)
    at Object.m.createChart (fusioncharts.js:875)
    at n.core.render (fusioncharts.js:1801)

工作代码

$(document).ready( function () {

    var jsonD = {};

    $.getJSON("http://localhost:8080/v1/cityData", function ( data ) {

        console.log("Success ");
        //alert(data);
        jsonD = data;

    }).done( function () {

        var cfChart= JSON.parse(jsonD.model.fusionCharts.chart);
        var cfData= JSON.parse(jsonD.model.fusionCharts.data);
        $("#fChart").insertFusionCharts({
             type: "column2d",
             width: "450",
             height: "250",
             dateFormat: "JSON",
            dataSource: {chart:cfChart,data:cfData}
         });
    });     
});

【问题讨论】:

  • $.getJSON() 函数不返回 JSON 字符串,它在 data 参数中将其传递给您的回调函数。从$.getJSON() 回调中调用.insertFusioncharts(),使用data - 注意jQuery 已经为你解析了JSON。
  • @nnnnnnn 在将它移入 $.getJSON 检查我的更新后,我仍然收到相同的消息“[object Object]”。
  • @dimas 您没有将 json 转换为字符串。做:var fcData = JSON.stringify(jsonD);
  • "[object Object]" 是我在控制台上调用.toString() 时希望看到的(使用console.log(data) 代替),但实际图表是否有效?我不熟悉该图表工具,但我使用的其他图表库期望数据作为数组/对象,而不是 JSON 字符串,并且 data 在 jQuery 自动解析您的 JSON 之后已经是一个对象.
  • @nishanth 和 nnnnnn 我只是在尝试看看它是否有效。无论如何,我尝试了您建议的代码,但图表仍然无法正常工作。我正在使用 fusioncharts 库。它说无效数据,也许这是库本身的问题?

标签: javascript jquery fusioncharts


【解决方案1】:

就像他的评论中提到的@nnnnnn...$.getJSON 不会返回json。它总是返回一个Deferred Object

如果你想使用 data$.getJSON 成功函数,你可以这样做:

//declaring in global scope
var jsonD={};
$.getJSON("http://localhost:8080/v1/cityData", function ( data ) {
    console.log("Success");
    alert(data);
    //changing the value in local scope
    jsonD = data;
}).done(function(){
        var fcData = jsonD.model.fusionCharts;
        $("#fChart").insertFusionCharts({
             type: "column2d",
             width: "450",
             height: "250",
             dateFormat: "JSON",
            dataSource: fcData
         });
 })

编辑

检查您的json 数据后,我发现数据未正确提取。 FusionCharts 期望 JSON 数据具有 chartdata 键。此数据存在于您的 JSONdata.model.fusionCharts 中,为 string

因此,您必须首先 extract 他们然后将其解析为 json,然后将其提供给您的 dataSource

所以,你实际的fusionChart 设置是这样的:

.done(function(){
            var cfChart= JSON.parse(jsonD.model.fusionCharts.chart);
            var cfData= JSON.parse(jsonD.model.fusionCharts.data);
            $("#fChart").insertFusionCharts({
                 type: "column2d",
                 width: "450",
                 height: "250",
                 dateFormat: "JSON",
                dataSource: {chart:cfChart,data:cfData}
             });
     })

【讨论】:

  • 应用您的建议后,我仍然收到错误消息...我已更新代码并发布了错误消息。
  • 有一个错字..检查最近的更新并尝试一下!
  • 现在图表出现了!非常感谢!希望我可以为这个答案添加更多点。虽然现在对您在数据源部分所做的事情有点困惑。
  • 好的,我在 dataSource 中所做的有两个步骤:1) 我确实通过执行 jsonD.model.fusionCharts.chart 从您的 JSON 数据中提取了 chart 部分。然后这是字符串,而 Fusion 图表需要 JSON,所以我必须通过 JSON.parse(<<extracted part>>) 转换为 json 2)我对 data 做了同样的提取,然后将其解析为 JSON。
  • 最后,我正在创建一个新对象... 1) chart 作为键,值作为 info extracted and parsed from jsonD.model.fusionCharts.chart 2) data 作为键,值作为 info extracted and parsed from jsonD.model.fusionCharts.data 并传递使用语法 dataSource: {chart:cfChart,data:cfData} 将其发送到 dataSource
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多