Javascript 将具有toJSON方法的对象数组序列化为JSON时出现奇怪错误
我使用NSwag为swagger API端点生成类型脚本和类。生成的类包含每个对象的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
.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;
}
}