未捕获的SyntaxError:意外的令牌o:简单的JSON解析器无法正常工作

时间:2014-10-26 12:14:37

标签: javascript json

有人可以看到这个简单的JSON解析器有什么问题吗? (JSFiddle Link

我在控制台中收到错误说 Uncaught SyntaxError: Unexpected token o

var a = document.getElementById('a');

var json = {
            type: "cow",
            sound: "moo",
            colors: ["black", "white", "brown"],
            feed: {
                types: ["hay", "grass"],
                consistency: "wet"
            }
        };

var parsed = JSON.parse(json);

//called with every property and it's value
function process(key,value) {
   console.log(key + " : " + value);
}

function traverse(o,func) {
    for (var i in o) {
        func.apply(this,[i,o[i]]);  
        if (o[i] !== null && typeof(o[i])=="object") {
            //going on step down in the object tree!!
            traverse(o[i],func);
        }
    }
}

//that's all... no magic, no bloated framework
traverse(json,process);

3 个答案:

答案 0 :(得分:1)

你不需要做任何解析!您的数据已存在于 JavaScript对象中,而不是 JSON字符串

这通常是一个混乱 - JSON是一个字符串,表示数据。 JavaScript对象是JS存储的实际数据。

答案 1 :(得分:1)

您的json不是JSON,它是对=右侧的对象初始化程序定义的对象的引用。看不到JSON。 JSON是用于数据交换的 textual 非源代码表示法。没有理由解析你拥有的东西; JavaScript引擎已经解析它:http://jsfiddle.net/m36n6zoj/2/

原因你得到的错误是JSON.parse强制它的第一个参数为一个字符串(因为它是用于解析JSON,它是文本的,因此在JavaScript中保存在字符串中码)。如果您使用json引用的通用对象并将其转换为字符串,则会获得"[object Object]"。所以你这样做:

JSON.parse("[object Object]")

到JSON解析器,它看起来像数组的开头([),后跟字母o。字母o在JSON中的该位置无效,因此您收到错误。

当然,如果您真的想使用JSON(也许您通常会通过ajax或其他东西加载json而这只是测试代码),您可以:http://jsfiddle.net/m36n6zoj/3/

var a = document.getElementById('a');

var json =
    '{' +
    '    "type": "cow",' +
    '    "sound": "moo",' +
    '    "colors": ["black", "white", "brown"],' +
    '    "feed": {' +
    '       "types": ["hay", "grass"],' +
    '       "consistency": "wet"' +
    '   }' +
    '}';

var parsed = JSON.parse(json);

//called with every property and it's value
function process(key,value) {
   console.log(key + " : " + value);
}

function traverse(o,func) {
    for (var i in o) {
        func.apply(this,[i,o[i]]);  
        if (o[i] !== null && typeof(o[i])=="object") {
            //going on step down in the object tree!!
            traverse(o[i],func);
        }
    }
}

//that's all... no magic, no bloated framework
traverse(parsed,process);

答案 2 :(得分:0)

我认为你有错误的json格式,你需要在这样的双引号中添加键

        "type": "cow"

这不是一个json对象,它是一个javascript对象,你提供所以它不会被解析,你想要它是JSON而不是去字符串化函数