首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将JSON对象映射到Javascript对象

将JSON对象映射到Javascript对象
EN

Stack Overflow用户
提问于 2012-01-09 10:30:52
回答 3查看 39.5K关注 0票数 19

在使用AJAX时,我倾向于以JSON对象(也称为Javascript)的形式将对象从我的服务器传递到Javascript。我的Javascript中的某些函数依赖于我正在使用的特定对象类型。例如,让我们使用电话号码。我有一个构造函数:

代码语言:javascript
复制
function PhoneNumber(number, type, isPrimary, contactId, id, className) {
    this.number = number;
    this.type = type;
    this.isPrimary = isPrimary;
    this.contactId = contactId;
    this.id = id;
    this.className = className;
}

我在Javascript中创建电话号码对象时使用它。在某些情况下,我不是在JS中创建对象,而是从服务器获取对象,因此它以具有完全相同字段的通用对象的形式出现。因此,当我的代码通过使用如下代码依赖于特定类型时:

代码语言:javascript
复制
var objType = objArray[i].constructor.name;
var mappedObj;

switch(objType) {
    case 'PhoneNumber':
        currentArray = currentArray.phone;
        //Convert response to javascript object.
        mappedObj = mapPhone(jsonResponse[i]);
        break;
    case 'Email':
        currentArray = currentArray.email;
        mappedObj = mapEmail(jsonResponse[i]);
        break;
    case 'Address':
        currentArray = currentArray.address;
        mappedObj = mapAddress(jsonResponse[i]);
        break;
    case 'Website':
        currentArray = currentArray.website;
        mappedObj = mapWebsite(jsonResponse[i]);
}

在这种情况下,我检查对象构造函数的名称,并根据该名称设置某些变量。如果我检查名称的对象是来自服务器的JSON,它只是给我一个通用的" object“响应,因此代码无法工作。我通过为每个对象使用一个映射函数来解决这个问题,例如:

代码语言:javascript
复制
function mapPhone(phoneObj) {
    var id = phoneObj.id;
    var contactId = phoneObj.contactId;
    var number = phoneObj.number;
    var type = phoneObj.type;
    var primary = phoneObj.isPrimary;
    var className = phoneObj.className;
    var phoneNumber = new PhoneNumber(number, type, primary, contactId, id, className);
    return phoneNumber;
}

这工作得很好,但对我来说似乎有点多余。这是解决JSON对象问题的最好方法,还是有更好的解决方案?我知道这更像是一个“我是不是以最好的方式做这件事”类型的问题,但我在Javascript代码中不断重复这种类型的逻辑,我想在我将来不得不花几个小时来修复它之前,我也可以得到关于它是否是正确的方法的另一种或两种观点。

编辑:我最终接受了jQuery解决方案,因为我碰巧在我的项目中使用了jQuery。然而,在我找到jQuery选项之前,有多种解决方案也适用于我。他们只是不太干净和有效率。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-09 11:06:40

以下内容要求您在对象和JSON对象中具有相同的属性。

代码语言:javascript
复制
var phoneNumber = $.extend(new PhoneNumber(), yourJSONObject);

这基本上是创建一个新的PhoneNumber对象,然后将所有属性从您的JSON对象复制到该对象上。$.extend()方法来自jQuery,但您也可以使用来自Underscore.js或其他js库/框架的类似方法。

票数 28
EN

Stack Overflow用户

发布于 2012-01-09 11:31:07

这个类似的问题有很多有趣的答案:

Parse JSON String into a Particular Object Prototype in JavaScript

根据发帖人自己的回答,我认为这对你来说是一个有效的解决方案:

代码语言:javascript
复制
function recastJSON(jsonObject) {
    // return generic object if objectType is not specified
    if (!jsonObject.objectType)
        return jsonObject;

    // otherwise create a new object of type specified
    var obj = eval('new '+jsonObject.objectType+'()');
    for(var i in jsonObject)
        obj[i] = jsonObject[i];
    return obj;
}

您需要将objectType添加到正在接收的JSON对象中,以定义要实例化的javascript类。然后,当您调用此函数时,它会将对象强制转换为该类型,并复制数据(包括变量'objectType')。

使用您的电话号码示例,您的代码将如下所示:

代码语言:javascript
复制
// generic object from JSON
var genericObject = {objectType:'PhoneNumber', number:'555-555-5555', type:'home', primary:true, contactId:123, id:1234, className:'stdPhone'};
var phoneObject = recastJSON(genericObject);
票数 5
EN

Stack Overflow用户

发布于 2012-01-09 10:51:06

AFAIK,在IE以外的所有东西中,你都可以这样做:

代码语言:javascript
复制
// define a class
var Foo = function(name) {
  this.name = name;
}
// make a method
Foo.prototype.shout = function() {
  return "I am " + this.name;
}
// make a simple object from JSON:
var x = JSON.parse('{ "name": "Jason" }');
// force its class to be Foo
x.__proto__ = Foo.prototype;
// the method works
x.shout();

不幸的是,IE不支持__proto__访问器,所以你需要做的是首先创建一个空的对象实例,然后复制所有内容:

代码语言:javascript
复制
// make a simple object from JSON:
var x = JSON.parse('{ "name": "Jason" }');
// make an empty Foo
var y = Object.create(Foo.prototype);
// copy stuff over
for (a in x) {
  y[a] = x[a];
}
y.shout();

这两种方法都比您的mapWhatever函数更通用,保持干爽。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8783327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档