从字符串创建JSON,用作对象

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 + '}'); 但在Chrome中出现 Uncaught SyntaxError: Unexpected token :

我尝试使用 JSON.parse,但在 Chrome 和 Firefox 中出现 TypeError: JSON.parse 不是一个函数,这必须是字符串的格式问题。我开始怀疑 "css" 条目,虽然它在第一个 "id" 条目时就开始抱怨了,但它期望的是一个函数而不是 JSON?

(我削减了原始JSON,但忘记了最重要的 "css" 条目)

[更新2]

好吧,所以我将 css 数据更改为'而不是",现在它会实际解析,但现在我的脚本已经崩溃了,因为我期望从数据库获得原始CSS,有没有办法将结果中的'css':'blabla'改为:"css":"blabla"


2
没有所谓的JSON对象。有JSON字符串和JavaScript对象;你想要获取哪一个?另外,你确定没有更好的方法吗? “我遍历”告诉我这是你的代码产生的,因此应该还有其他选项可用。 - Jon
@FelixKling 我理解它们之间的区别,但是它无法正确转换为可用的对象。例如,当我尝试对其进行eval时,会出现“Uncaught SyntaxError: Unexpected token : ”的错误,我没有看到JSON字符串格式有任何问题。 - TrySpace
1
编辑此问题并为其设置悬赏是错误的。您最初的问题的答案 - 如何将JSON编码的字符串解析为对象 - 非常简单,即使用 JSON.parse。如果您收到 TypeError:JSON.parse不是函数 - 我以前从未见过,并且对我来说没有太多意义 - 那么您需要为此启动一个新问题,最好提供一个测试用例让我们复制该问题 - Mark Amery
@TrySpace:你不能直接使用eval来执行一个包含JSON的字符串,因为它不是有效的JavaScript代码。你需要在字符串周围添加(...),例如eval('(' + jsonStr + ')')。但正如已经多次提到的那样,一旦你有了有效的JSON,你应该使用JSON.parse - Felix Kling
如果你遇到了“TypeError”的错误提示,那很可能是因为你使用了一个覆盖全局JSON对象的第三方库。请查看Firebug中的DOM选项卡。 - Dziad Borowy
显示剩余3条评论
9个回答

15
如果你有包含有效 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 字符串,它需要将 {} 作为字符串的一部分。

Translated:

Please note that as a valid JSON string, it requires {} to be part of the string.


尝试过这个,但每次都会出现“TypeError: JSON.parse不是一个函数”的错误。可能是因为它不是正确的JSON格式。 - TrySpace
1
你正在使用哪个浏览器?JSON.parse 几乎在现有的所有浏览器中都是可用的 - http://caniuse.com/json - knolleary
1
@TrySpace:不,那与此无关。你的浏览器似乎只是没有实现该功能。在这种情况下,你可以使用json3:https://github.com/bestiejs/json3。 - Felix Kling
@FelixKling 这很奇怪,因为在其他情况下它确实可以工作,函数肯定存在,但看起来它会抛出一个错误,因为它无法“计算”。 - TrySpace
2
@TrySpace:如果你使用jQuery(你在问题中添加了这个标签),你可以尝试使用$.parseJSON("{"+value+"}")代替原生的JSON.parse("{"+value+"}")函数吗? - Romain Paulus

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/


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部分中删除了"
以下是输出结果 enter image description here 请参考下面的URL:http://api.jquery.com/jQuery.parseJSON/


3

这里有一个使用正则表达式的解析器!

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

这很简单,不是吗?


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

And here is my fiddle


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这样的工具总是很有帮助的!

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

虽然它已经可以了,但是它看起来肯定可以更干净。


该字符串不是有效的JSON。 - Felix Kling
@FelixKling 现在怎么样? - federico-t
1
更好了,但这不是 OP 想要的。你可能需要解释如何将 OP 的字符串转换为一个包含有效 JSON 的字符串。 - Felix Kling
尝试过这个,但每次都会出现“TypeError: JSON.parse不是一个函数”的错误。可能是因为它不是正确的JSON格式。 - TrySpace

0

这个怎么样?

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

这是更安全、更快的替代方案,适用于您的eval和JSON.parse需求。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接