9

所以我想创建这个 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%)" }"
}

从字符串:

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 + '}');但我进入Uncaught SyntaxError: Unexpected token :了 Chrome。

我试过 JSON.parse 但得到:TypeError: JSON.parse is not a function在 Chrome 和 Firefox 中,它必须是字符串的格式。我开始怀疑“css”条目,虽然它在第一个“id”条目开始抱怨,但它期待一个函数而不是 JSON?

(我减少了原始 JSON,但忘记了最重要的“css”)

[更新2]

好的,所以我将 css 数据更改为,'而不是",现在它实际上会解析,但现在我的脚本已损坏,因为我期待来自 db 的原始 CSS,任何方式将结果更改'css':'blabla'为:"css":"blabla"

4

9 回答 9

14

如果您有一个包含有效 JSON 的字符串,您可以使用JSON.parse().

假设你有一个字符串:

value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""';

然后你会做:

obj = JSON.parse("{"+value+"}");JSON

请注意,它需要{}作为字符串的一部分才能成为有效的 JSON 字符串。

于 2013-08-14T12:51:12.187 回答
6

好的,所以这是我能想到的最好的:

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];
    }
});

http://jsfiddle.net/SkCVd/5/

于 2013-08-19T23:34:02.403 回答
4

jquery将字符串解析为 Json是内置选项。

作为

  var str = '{   "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%) }"}';
    $(document).ready(function () {

        var result = jQuery.parseJSON(str);
        console.log(result);
    });

"从 CSS 部分删除
这里是输出 在此处输入图像描述 参考下面的 url http://api.jquery.com/jQuery.parseJSON/

于 2013-08-23T06:42:25.340 回答
3

这是一个使用 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]);
});

它很简单不是吗?

于 2013-08-22T10:51:23.223 回答
2

如果您说您的字符串未解析的原因是因为 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);

这是我的小提琴

于 2013-08-18T13:34:53.747 回答
2

正如每个人已经提到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); 

这是功能示例:http: //jsfiddle.net/vojtiik/pzJTa/

像这个JsonViewer这样的工具总是有帮助的!

于 2013-08-24T19:14:54.477 回答
0

这个怎么样

  var arr = new Function('return {' + value + '}')();

eval对于您的要求,这对于 JSON.parse来说更安全、更快捷。

于 2013-08-23T12:21:35.567 回答
0

您正在寻找的是JSON.parse

var str = '{"id":"3",
"created":"0000-00-00",
"parentIDs":null,
"childIDs":"",
"uid":"movies",
"title":"Movies",
"related":"movies",
"pos":""}',
    foo = JSON.parse(str);

它当然可以看起来更干净。

于 2013-08-14T12:56:28.727 回答
0

据我了解,您没有使用 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属性(如果你想在字符串中包含引号,你可以简单地使用不同的引号来标记字符串的开始和结束)。没有其他方法 - 你只需要正确引用你的字符串常量。

于 2013-08-24T19:45:38.990 回答