Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将具有toJSON方法的对象数组序列化为JSON时出现奇怪错误_Javascript_Json_Typescript_Nswag - Fatal编程技术网

Javascript 将具有toJSON方法的对象数组序列化为JSON时出现奇怪错误

Javascript 将具有toJSON方法的对象数组序列化为JSON时出现奇怪错误,javascript,json,typescript,nswag,Javascript,Json,Typescript,Nswag,我使用NSwag为swagger API端点生成类型脚本和类。生成的类包含每个对象的.toJSON()方法,当使用JSON.stringify()将对象序列化为JSON时,会调用该方法 序列化单个对象时,所有这些都可以正常工作,但当我尝试序列化对象数组时,会抛出一个奇怪的错误: angular.js:14199 TypeError: Cannot create property 'code' on string '0' at Dashboard.toJSON (App/models/ap

我使用NSwag为swagger API端点生成类型脚本和类。生成的类包含每个对象的
.toJSON()
方法,当使用
JSON.stringify()
将对象序列化为JSON时,会调用该方法

序列化单个对象时,所有这些都可以正常工作,但当我尝试序列化对象数组时,会抛出一个奇怪的错误:

angular.js:14199 TypeError: Cannot create property 'code' on string '0'
    at Dashboard.toJSON (App/models/api.js:785:34)
    at JSON.stringify (<anonymous>)
课堂摘录:

export class Dashboard implements IDashboard {
    code?: string | undefined;
    ...

    constructor(data?: IDashboard) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(data?: any) {
        if (data) {
            this.code = data["code"];
            ...
        }
    }

    static fromJS(data: any): Dashboard {
        let result = new Dashboard();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = data ? data : {};
        data["code"] = this.code;
        ...
        return data; 
    }

    clone() {
        const json = this.toJSON();
        let result = new Dashboard();
        result.init(json);
        return result;
    }
}
导出类仪表板实现IDashboard{
代码?:字符串|未定义;
...
构造函数(数据?:IDashboard){
如果(数据){
for(数据中的var属性){
if(data.hasOwnProperty(property))
(此)[属性]=(数据)[属性];
}
}
}
初始化(数据?:任何){
如果(数据){
this.code=数据[“code”];
...
}
}
静态fromJS(数据:任意):仪表板{
让结果=新仪表板();
result.init(数据);
返回结果;
}
toJSON(数据?:任何){
数据=数据?数据:{};
数据[“代码”]=此.code;
...
返回数据;
}
克隆(){
const json=this.toJSON();
让结果=新仪表板();
init(json);
返回结果;
}
}

知道为什么
JSON.stringify()
使用“0”参数调用
toJSON()
方法吗?

将使用一个参数调用方法
toJSON
,该参数是
this
分配给的属性名。本质上,您感兴趣的值不是那个参数,而是这个,它将绑定到您可以转换的值。由于使用数组调用
stringify
,因此将使用该数组的可枚举属性调用
toJSON
,即
0
1
,而
将是相应的仪表板对象

另外,我觉得您可以很好地利用
对象。assign
将属性从一个对象复制到另一个对象,这基本上就是您在构造函数的
for
循环中所做的

这就是你可以做到的。我删除了typescript装饰并使用了纯JavaScript,但原理仍然是一样的:

类仪表板{
建造师(数据){
//Object.assign基本上完成了循环所需的操作:
分配(此,数据);
}
初始化(数据){
返回Object.assign(这个,数据);
}
静态fromJS(数据){
返回新的仪表板(数据);
}
toJSON(键){
//`key`是父对象中属性的键/索引。
//你可能对此不感兴趣。你需要“这个”。
//将属性提取到普通对象中,并将其返回进行字符串化
返回Object.assign({},this);
}
克隆(){
返回新的仪表板(此);
}
}
log(JSON.stringify([
Dashboard.fromJS({
代码:“1212312”,
名称:“特雷萨达斯”,
描述:“一些描述”
}),
Dashboard.fromJS({
代码:“1212312”,
名称:“特雷萨达斯”,
描述:“一些描述”
})

]));可能是因为传递数组的第一个索引为0?看起来确实如此。但是为什么它会将元素的索引作为参数传递给
toJSON
方法呢?您能否提供
console.log(JSON.stringify([…
)的预期输出,这样我就可以提供更切题的答案了?[{“code”:“1212312”,“name”:“tresads”,“description”:“some description”},{“code”:“1212312”,“name”:“tresads”,“description”:“some description”}]感谢您的深入解释:)我很想知道您在哪里发现“将使用一个参数调用toJSON方法,该参数是分配给它的属性名。”“我已经搜索了几个小时,这是我能找到的第一个提到它的地方?”duckworth,和。
export class Dashboard implements IDashboard {
    code?: string | undefined;
    ...

    constructor(data?: IDashboard) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(data?: any) {
        if (data) {
            this.code = data["code"];
            ...
        }
    }

    static fromJS(data: any): Dashboard {
        let result = new Dashboard();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = data ? data : {};
        data["code"] = this.code;
        ...
        return data; 
    }

    clone() {
        const json = this.toJSON();
        let result = new Dashboard();
        result.init(json);
        return result;
    }
}