JSON.parse()意外令牌的数据编码

时间:2014-05-01 00:41:57

标签: javascript json character-encoding

我从服务器中提取一些数据并对其进行操作,然后尝试使用JSON.parse()将字符串加载到对象中。但是每当我尝试这样做时,都会出现Unexpected Token错误。奇怪的是,通常chrome会告诉我意外的标记是什么(通常是' o'或其他东西)。这次只是一个空间。这让我觉得有一些类型的ascii编码错误或正在发生的事情。如果我将json字符串打印到执行console.log()的控制台,然后将其直接粘贴到代码中,那么解析字符串就没有问题。

 var testString = '[ { "pk": 1663, "state": "IO", "group": "ALO", "species": "", "application_link": "" } ]';
var testObject = JSON.parse(testString);
alert(testObject);

完全符合我的预期。但这并不是:

function hex2ascii(hexx) { //stolen off stackoverflow
    var hex = hexx.toString();//force conversion
    var str = '';
    for (var i = 0; i < hex.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}

function decodeData(encoded){
    var original_string = '';
    for (var i = 0; i < encoded.length; i+=2) {
        var index = i/2;
        var hex_value = encoded[i]+encoded[i+1];
        var ochar = hex2ascii(hex_value);
        original_string += ochar;
    }
    return original_string;
}
$.get(url, function(data) {
     var testString = decodeData(data); //decodeData grabs a hex string and then decodes it into a json formatted string
    var testObject = JSON.parse(testString); //Unexpected Token
    alert(testObject);
});

有人对如何解决这个问题有任何想法吗?

编辑: 我不知道为什么,但我的字符串中有一堆空值。当我遍历json字符串并将其转换回十六进制时,我得到:

hex_string = ''
for(var i = 0; i < decoded_data.length; i++){
    if (i < 10){ 
        alert(decoded_data[i]);
    }
    hex_string += ascii2hex(decoded_data[i])+' ';
}
console.log(hex_string);

>>>0 0 5b 0 0 7b 0 0 22 0 0 70 0 0 6b 0 0 22 0 0 3a 0 0 20 0 0 31 0 0 36 0 0 36 0 0

再次编辑:

好的,所以我把它归结为我的连接方法。出于某种原因,在我将它连接在一起时,在decodeData函数中进行

original_string += ochar;

它投掷了一堆空字符。还有另一种方法将字符串连接在一起吗?

编辑回答:

好的,所以问题在于hex2ascii函数。它添加了一堆空字符。这是我偷走堆栈溢出的代码,并不是我所期望的。我最终把它改成了这个,现在它已经变成了金色。

function hex2ascii(hexx) {
   var hex = hexx.toString();//force conversion
   return String.fromCharCode(parseInt(hex, 16));
}

3 个答案:

答案 0 :(得分:1)

你不能在javascript字符串中输入break行,它会使它无效。

<强>无效

var testString = '[ {
        "pk": 1663,
        "state": "IO",
        "group": "ALO",
        "species": ""
]}';

<强>有效

var testString = '[ {"pk": 1663,"state": "IO","group": "ALO","species": ""]}';

答案 1 :(得分:1)

我认为您获得意外令牌错误的原因是因为您在该行上有一个额外的括号

$.get(url, function(data)) {

你最后错过了一个括号。

答案 2 :(得分:0)

好的,所以问题在于hex2ascii函数。它添加了一堆空字符。这是代码我偷走了堆栈溢出而不是我的预期。我最终改变它,现在它是金色的。

function hex2ascii(hexx) {
   var hex = hexx.toString();//force conversion
   return String.fromCharCode(parseInt(hex, 16));
}