所以我想创建这个JSON对象:
{
"id":"3",
"created":"0000-00-00",
"parentIDs":null,
"childIDs":"",
"uid":"movies",
"title":"Movies",
"related":"movies",
"pos":"",
"css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"
}
Run Code Online (Sandbox Code Playgroud)
来自字符串:
value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"""
Run Code Online (Sandbox Code Playgroud)
这个字符串来自一个数据库,所以我无法真正改变格式,但它应该像这样正确.
(这个字符串来自一个类似的字符串数组,我迭代它们,不知何故丢失它们周围的{}
我尝试删除外部引号value.substr(1, value.length - 2);.然后转换它.toJSON();但它只添加了许多我不需要的额外斜杠.
我只需要添加{}它,然后javascript会将其视为JSON对象.
有没有这样做的简写方法?或者是否有一个小型库可以巧妙地将我凌乱的字符串转换为JSON对象?
[update]
Run Code Online (Sandbox Code Playgroud)
我试过了:eval('{' + value + '}');但我进入Uncaught SyntaxError: Unexpected token :了Chrome.
我试过JSON.parse但得到:TypeError: JSON.parse is not a function在Chrome和Firefox中,它必须是字符串的格式.我开始怀疑"css"条目,虽然它开始抱怨第一个"id"条目,它期待一个函数而不是JSON?
(我减少了原始JSON,但忘记了最重要的"css")
[UPDATE2]
好吧,所以我改变了css数据'而不是",现在它实际上会解析,但现在我的脚本坏了,因为我期待从db中获取原始CSS,任何方式将结果更改'css':'blabla'为:"css":"blabla"?
kno*_*ary 14
如果您有一个包含有效JSON的字符串,则可以使用它将其转换为JavaScript对象JSON.parse().
假设你有一个字符串:
value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""';
Run Code Online (Sandbox Code Playgroud)
然后你会这样做:
obj = JSON.parse("{"+value+"}");JSON
Run Code Online (Sandbox Code Playgroud)
请注意,它需要{}字符串的一部分作为有效的JSON字符串.
好的,所以这是我能想到的最好的:
var value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"';
var nestedObjects = [];
String.prototype.trimQuotes = function () {
return this.indexOf('"') === this.lastIndexOf('"') ? this.substring(this.indexOf('"') + 1) : this.substring(this.indexOf('"') + 1, this.lastIndexOf('"'));
};
function convertObject(str) {
var retObj = {};
$.each(str.split(','), function () {
var keypair = this.split(':');
if (keypair.length < 2) { return; }
retObj[keypair[0].trimQuotes().trim()] = keypair[1].indexOf('@') > -1 ? nestedObjects[parseInt(keypair[1].trimQuotes().substring(1), 10)].trimQuotes().trim() : keypair[1].trimQuotes();
});
return retObj;
}
var temp = value.split('{')[0];
$.each(value.split('{'), function (i, t) {
if (i === 0) {
return;
}
var splits = t.split('}');
nestedObjects.push(splits[0]);
temp += '@' + (i - 1);
if (splits.length > 1) {
temp += splits[1];
}
});
Run Code Online (Sandbox Code Playgroud)