理解json语法的问题

时间:2013-06-28 08:44:41

标签: javascript json d3.js arrays array-difference

我有一个json文件

命名:abcd.json

它的内容开始如下(这对我来说非常奇怪,因为这是我第一次遇到这样的json文件) - >

["51b59c2081ecf", [["parties", 0.0793, 0.238], ["signature", 0.002, 0.006]]]
["51b59c2683e7d", [["parties", 0.0037, 0.011]]]
["51b59c255e1fb", [["parties", 0.0037, 0.011]]]
["51b59c2e95da5", [["parties", 0.0037, 0.011]]]

我遇到了另一个json文件

命名:color.json

{
    "colorsArray":[{
            "colorName":"red",
            "hexValue":"#f00"
        },
        {
            "colorName":"green",
            "hexValue":"#0f0"
        },
        {
            "colorName":"blue",
            "hexValue":"#00f"
        },
        {
            "colorName":"black",
            "hexValue":"#000"
        }
    ]
}

我正在使用D3js,我想将abcd.json的内容推送到一个数组中,以便我可以进一步使用该数据。

MyQuestions:

  1. 如果它们都是json.files而不是为什么它们的语法之间存在一些差异。我的整个d3代码依赖于这些数据。
  2. 2.如何将json数据推送到变量说Var数据。

    目前我为某些临时测试提供了一些静态值的var数据,比如this->

     var data= [
            ["51b59c2a019af", [["signature", 0.002, 0.006], ["parties", 0.0037, 0.011]]],
            ["51b59c2635997", [["fashion", 0.002, 0.006], ["parties", 0.0037, 0.011],["royal-challenge", 0.002, 0.6]]],
            ["51b59c29c39bf", [["parties", 0.0037, 0.1], ["signature", 0.002, 0.006]]]
               ];
    

2 个答案:

答案 0 :(得分:0)

我认为前者不是一个合适的JSON,但是浏览器中的大多数库和JSON.parse仍然会解析它并返回一个数组。

见下面的jQuery代码:

parseJSON: function( data ) {
    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    if ( data === null ) {
        return data;
    }

    if ( typeof data === "string" ) {

        // Make sure leading/trailing whitespace is removed (IE can't handle it)
        data = jQuery.trim( data );

        if ( data ) {
            // Make sure the incoming data is actual JSON
            // Logic borrowed from http://json.org/json2.js
            if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                .replace( rvalidtokens, "]" )
                .replace( rvalidbraces, "")) ) {

                return ( new Function( "return " + data ) )();
            }
        }
    }

    jQuery.error( "Invalid JSON: " + data );
}

它使用new Function()创建对象,类似于eval()(但更好,因为它无法访问代码的范围),因此在这种情况下它仍将解析它。 / p>

答案 1 :(得分:0)

如果你有一个字符串中的文件内容,你可以通过将其包装在[]内并添加相应的逗号轻松地将其转换为有效的JSON;

var str = '["51b59c2081ecf", [["parties", 0.0793, 0.238], ["signature", 0.002, 0.006]]]' + "\n" + 
          '["51b59c2683e7d", [["parties", 0.0037, 0.011]]]' + "\n" +
          '["51b59c255e1fb", [["parties", 0.0037, 0.011]]]' + "\n" +
          '["51b59c2e95da5", [["parties", 0.0037, 0.011]]]' + "\n";

var valid_json = '[' + str.split(/[\n\r]/).
                           filter(function(val) { return (val !== ''); }).
                           join(',') + ']';

console.log(valid_json);