JSON.parse()返回一个字符串,而不是对象

JSON.parse()返回一个字符串,而不是对象

问题描述:

尽管在这个相同的主题上已经打开了很多问题,但我还是不愿意提出一个新的问题,但是我完全不知道为什么这不是加工。JSON.parse()返回一个字符串,而不是对象

我试图创建下面的代码一个JSON对象:

   var p = JSON.stringify(decodeJSON('{{post.as_json}}')) 
       var post = JSON.parse(p); 
       console.log(post); // Debug log to test if code is valid 

而且decodeJSON功能:

function decodeJSON(json) { 
     var txt = document.createElement("textarea"); 
     txt.innerHTML = json; 
     return txt.value.replace(/u'/g, "'"); 
     } 

console.log(post)返回以下JSON字符串:

{'content': 'kj fasf', 'uid': '4eL1BQ__', 'created': '07/09/2017', 'replies': [], 'tags': ['python'], 'by': {'username': 'Dorian', 'img_url': '/static/imgs/user_Dorian/beaut.jpg'}, 'likes': 0} 

扫描完字符串后,我非常确定JSON是有效的,并且没有语法错误。但是,运行时JSON.parse(p)而不是接收一个对象,我得到一个字符串。可能是什么原因?

+4

这不是JSON字符串。 JSON使用''',而不是''' – baao

+0

@baao我认为这也可能是原因,所以我尝试用'''替换所有''',但是然后我得到一个'Invalid token'错误。 –

+0

看起来你似乎正在使用模板引擎。如果是的话,你所要做的就是'var post = {{post.as_json}};'并称它为一天。但是,这假定'as_json'确实返回JSON,这似乎并非如此。你应该先解决。其他的一切都只是一个怪异的解决方法。 –

您的代码中的问题是您对字符串本身执行JSON.stringify。所以解析这个字符串的结果将是一个字符串。实际上,您已经过两次字符串并解析了一次。如果你再解析一次,你会得到一个JSON。但是为了解决方案避免两次字符串化。

替换您的代码。

var p = decodeJSON('{{post.as_json}}'); 

,将工作

+0

它给了我'位置1 JSON'未捕获的SyntaxError:意外的令牌'' –

+0

@DorianDore,看看我的更新答案。 –

这是因为decodeJSON返回一个字符串,并JSON.stringify轮流在另一

另一方面,您对字符串使用了JSON.strigify()方法。您应串联一个对象,而不是字符串

JSON.stringify() turns a javascript object to json text and stores it in a string.

当您使用JSON.parse你得到通过decodedJSON函数返回,不会反对。

解决方案:

var p = JSON.stringify('{{post.as_json}}'); 
var post = JSON.parse(p); 
console.log(post); 

It gives me Uncaught SyntaxError: Unexpected token ' in JSON at position 1

解决的办法是修改decodeJSON方法。

function decodeJSON(json) { 
    var txt = document.createElement("textarea"); 
    txt.innerHTML = json; 
    return txt.value.replace(/u'/g, '\"'); 
} 

var p = decodeJSON('{{post.as_json}}'); 
var post = JSON.parse(p); 
console.log(post);