将JSON反序列化为JavaScript对象

9

我有一个问题,需要将JSON文本反序列化为JavaScript对象,我测试了jQuery和YUI库,我有以下类:

function Identifier(name, contextId) {
    this.name = name;
    this.contextId = contextId;
}

Identifier.prototype.setName = function(name) {
    this.name = name;
}

Identifier.prototype.getName = function() {
    return this.name;
}

Identifier.prototype.setContextId = function(contexId) {
    this.contextId= contexId;
}

Identifier.prototype.getContextId = function() {
    return this.contextId;
}

and i have this JSON:

{
"Identifier": { 
   "name":"uno",
   "contextId":"dos"}
}

我想解析并创建一个标识符对象,但问题在于这句话:
var obj = jQuery.parseJSON('{"Identifier": { "name":"uno","contextId":"dos"}}');

或者

var obj2 = JSON.parse('{"Identifier": { "name":"uno","contextId":"dos"}}');

不起作用,变量obj和obj2不是标识符对象,我该如何解析它们? 谢谢

这个问题并不是重复的,因为它比Michael标记为重复的问题提前了5年。


您无法使用 JSON 创建 Identifier 对象,但是您可以使用相同数据结构创建对象字面量,但其中的函数将无法工作。您可以在获取 JSON 后将这些函数添加到字面量中,使它像一个 Identifier 对象一样工作。 - Stephen O'Connor
1
Identifier 添加一个 fromJson 方法,根据 JSON 解析和处理数据以创建一个新的 Identifier 实例。 - Felix Kling
另外,当使用JSON.parse时,您可以使用“reviver”函数参数,该参数将为您字符串化的json字符串的每个属性调用。在该“reviver”函数内部,您可以在适当的时间创建一个“Identifier”对象,即在解析最后一个属性时。在MDN上有一些示例。 - Martin Carel
1个回答

8
您可以创建一个函数来为您初始化这些对象。以下是我快速起草的一个函数:
function parseJSONToObject(str) {
    var json = JSON.parse(str);

    var name = null;
    for(var i in json) { //Get the first property to act as name
        name = i;
        break;
    }

    if (name == null)
        return null;

    var obj = new window[name]();
    for(var i in json[name])
        obj[i] = json[name][i];

    return obj;
}

这将创建一个由第一个属性的名称所表示类型的对象,并根据第一个属性对象的属性分配它的值。您可以像这样使用它:
var identifier = parseJSONToObject('{"Identifier": { "name":"uno","contextId":"dos"}}');
console.log(identifier);

Live example


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