Jquery 从字符串创建JSON,用作对象
所以我想创建这个JSON对象:Jquery 从字符串创建JSON,用作对象,jquery,json,Jquery,Json,所以我想创建这个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)
{
"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%)" }"
}
从字符串:
value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"""
这个字符串来自数据库,所以我不能真正更改格式,但它应该是这样正确的
(这个字符串源于一个类似字符串的数组,我在其中迭代,不知何故丢失了它们周围的{})
我尝试用value.substr(1,value.length-2)删除外部引号代码>。然后用.toJSON()转换它代码>但它只添加了很多我不需要的额外斜杠
我只需要在它周围添加{}
,然后javascript会将它视为JSON对象
有什么速记方法吗?或者是否有一个小的库可以以一种巧妙的方式将我凌乱的字符串转换为JSON对象
[update]
我试过:eval('{'+value+'}')代码>但我在Chrome中得到了未捕获的语法错误:意外标记:
我尝试了JSON.parse,但得到:TypeError:JSON.parse在Chrome和Firefox中不是函数,它必须是字符串的格式。我开始怀疑“css”条目,虽然它在第一个“id”条目开始抱怨,但它期望的是函数而不是JSON
(我删掉了原始JSON,但忘记了最重要的“css”一个)
[更新2]
好的,所以我将css数据改为,
,而不是“
,现在它将实际解析,但现在我的脚本被破坏了,因为我希望数据库中有原始css,可以通过任何方式将结果'css':'blablabla'
更改为:“css”:“blablabla“
?如果您有一个包含有效JSON的字符串,您可以使用JSON.parse()
将其转换为JavaScript对象
假设您有一个字符串:
value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""';
然后你会做:
obj = JSON.parse("{"+value+"}");JSON
注意,它需要{}
作为字符串的一部分才能成为有效的JSON字符串。您要查找的是:
不过,它看起来肯定会更干净。如果您说字符串没有解析的原因是因为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%)" }"';
value = value.replace("\"{", "{");
value = value.replace("}\"", "}");
value = "{"+value+"}";
value = JSON.parse(value);
console.log(value);
这是我的好的,这是我能想到的最好的:
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];
}
});
var value='“id”:“3”,“created”:“0000-00-00”,“parentId”:“null”,“childId”:“uid”:“imdb”,“title”:“imdb”,“related”:“movies”,“pos”:“css”:“{“background image”:”-webkit线性渐变(底部,rgb(46,44,46)49%,rgb(18,17,18)75%)”;
var nestedObjects=[];
String.prototype.trimQuotes=函数(){
返回this.indexOf(“”)==this.lastIndexOf(“”)?this.substring(this.indexOf(“”)+1):this.substring(this.indexOf(“”)+1,this.lastIndexOf(“”);
};
函数转换对象(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?嵌套对象[parseInt(keypair[1].trimQuotes().substring(1),10)].trimQuotes().trim():keypair[1].trimQuotes();
});
返回retObj;
}
var temp=value.split('{')[0];
$.each(value.split('{'),函数(i,t){
如果(i==0){
返回;
}
var splits=t.split('}');
nestedObjects.push(拆分[0]);
温度+='@'+(i-1);
如果(拆分长度>1){
温度+=拆分[1];
}
});
这是一个使用regx的解析器
var tmp = '"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 reg = /"(\w+)":(?:"([\w-]*)"|"{([^}]*)}"|(null))/g;
var obj ={};
tmp.replace(reg,function(text,all,dall,hall,vall){
obj[all]=hall||dall||vall;
console.log(all +":"+obj[all]);
});
它非常简单,不是吗?将字符串解析为Json是jquery
中的内置选项
作为
从CSS部分删除了“
。
这是输出
请参阅下面的url,这个怎么样
var arr = new Function('return {' + value + '}')();
这对于满足您的需求的eval
和JSON.parse来说是一种更安全、更快的等效方法。正如大家已经提到的jQuery.parseJSON()
就是一种方法。在您的情况下,您需要首先清理从SQL获得的字符串,否则您将无法解析为正确的JSON:
// format from SQL : value = "validJSON"
var fromSQL = 'value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"""';
// we need to remove @value ="' at the beginnig and '"' at the end
var withoutWrapper = fromSQL.substring(('value = "').length, fromSQL.length-1);
// now add {} to make it as a json obj
var withNewWrapper = '{' +withoutWrapper +'}';
// parse it
var json= jQuery.parseJSON(withNewWrapper);
以下是功能示例:
像这样的工具总是有帮助的!据我所知,您不是通过AJAX接收此字符串,而是将其直接嵌入服务器端的某个脚本中-因此无需在客户端解析它(这里不需要JSON.parse)。您只需根据JSON规则正确编写对象数据:
var data_object = {
"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%)" }'
}
注意css属性(若您想在字符串中包含引号,只需使用不同的引号来标记字符串的开始和结束)。没有其他方法-您只需正确引用字符串常量。没有JSON对象。有JSON字符串和JavaScript对象;您想获取这两个对象中的哪一个?此外,您确定没有更好的方法吗?“我迭代”告诉我这是您的代码产生的,所以其他选项应该是可用的。“我只需要在它周围添加{},然后javascript会将其视为JSON对象。”不。如果在开头和结尾添加{
和}
,则可能有一个包含有效JSON的字符串(不是对象)。但这正是您想要的,对吗?如果您想要一个JavaScript对象,您必须将新字符串传递给JSON.parse
。我想您应该看看,以便更好地了解JSON和JavaScript对象之间的差异。基本上,我想要一个可用的对象,可以通过value.id访问,例如当它是一个字符串时,我不能这样做。@FelixKling我理解其中的区别,它只是不能正确地转换为一个可用的对象,例如,我得到“Uncaught SyntaxError:Unexpected token:”当我尝试评估它时,我没有发现JSON字符串的格式有任何错误。将这个问题编辑到你已经知道的程度,并对其进行奖励,这是错误的。你最初的问题的答案是——如何将JSON编码的字符串解析为对象——非常简单,并且是使用JSON.parse
。如果你得到TypeError:JSON.parse不是一个函数
——我从未使用过它
// format from SQL : value = "validJSON"
var fromSQL = 'value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"""';
// we need to remove @value ="' at the beginnig and '"' at the end
var withoutWrapper = fromSQL.substring(('value = "').length, fromSQL.length-1);
// now add {} to make it as a json obj
var withNewWrapper = '{' +withoutWrapper +'}';
// parse it
var json= jQuery.parseJSON(withNewWrapper);
var data_object = {
"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%)" }'
}