You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ember.set设置模型属性后JSON.stringify无法获取值,问题何在?

问题原因与解决方案

为什么JSON.stringify(model)找不到动态添加的属性?

Ember的模型(比如DS.Model)是基于预定义属性列表工作的——只有你在模型类里用attr()声明的属性,才会被Ember的序列化系统识别并纳入序列化范围。你用Ember.set(model, 'processedTrans', 'TechMahindra')添加的是模型实例的临时属性,它并没有被注册到模型的官方属性列表中,所以默认情况下:

  • model.get()能拿到它,因为get方法会遍历实例的所有属性(包括临时添加的);
  • 但JSON.stringify(model)或者模型自带的toJSON()方法,只会序列化那些在模型类里声明过的属性,不会包含这个临时属性。

怎么让这个属性出现在JSON字符串中?

根据你的使用场景,有几种方案可选:

方案1:在模型类中显式声明属性(推荐,适合需要长期使用的属性)

如果processedTrans是业务中需要经常用到的属性,直接在你的模型类里添加这个属性定义:

// 比如你的模型文件 app/models/your-model.js
import Model, { attr } from '@ember-data/model';

export default class YourModel extends Model {
  // 其他已定义的属性...
  @attr('string') processedTrans;
}

这样之后,不管是model.get()还是序列化(包括JSON.stringify或者model.toJSON()),这个属性都会被正常包含。

方案2:手动组合序列化数据(适合临时属性)

如果只是临时需要把这个属性加入JSON,可以先获取模型的标准序列化数据,再手动添加临时属性:

// 先获取模型预定义属性的序列化结果
const serializedModel = model.toJSON();
// 添加临时属性
serializedModel.processedTrans = model.get('processedTrans');
// 再转成JSON字符串
const jsonString = JSON.stringify(serializedModel);

或者用Ember的getProperties方法一次性获取需要的属性:

const data = model.getProperties('id', 'name', 'processedTrans'); // 替换成你需要的属性
const jsonString = JSON.stringify(data);

方案3:自定义序列化器(适合全局需要包含临时属性的场景)

如果你的项目中很多地方都需要把这类临时属性加入序列化,可以自定义模型的序列化器,重写serialize方法:

// app/serializers/your-model.js
import JSONSerializer from '@ember-data/serializer/json';

export default class YourModelSerializer extends JSONSerializer {
  serialize(snapshot, options) {
    const json = super.serialize(snapshot, options);
    // 从模型实例中获取临时属性并添加到序列化结果
    json.processedTrans = snapshot.record.get('processedTrans');
    return json;
  }
}

之后调用model.toJSON()时,就会自动包含这个属性了。

补充:你设置的内容属于模型的属性吗?

它属于模型实例的属性,但不属于模型类预定义的序列化属性。Ember允许你给实例动态添加任意属性,但这些属性不会自动参与模型的序列化、持久化等核心流程,除非你显式把它们加入到模型的属性定义或者序列化逻辑中。

内容的提问来源于stack exchange,提问作者user2024080

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:49