.NET MAUI MVVM源生成器场景下,System.Text.Json忽略属性的替代方法
解决方法
问题根源在于CommunityToolkit.Mvvm的源生成器会基于私有字段生成公共属性,你给私有字段添加的[JsonIgnore]不会自动传递到生成的公共属性上,因此序列化时依然会处理这些公共属性。以下是几种可行的解决方式:
方法1:使用ObservableProperty特性的JsonIgnore参数
这是最简洁的方案,直接在私有字段的[ObservableProperty]特性中指定JsonIgnore = true,源生成器会自动给生成的公共属性添加[JsonIgnore]特性:
using CommunityToolkit.Mvvm.ComponentModel; using System.Text.Json.Serialization; public partial class MyViewModel : ObservableObject { // 生成的公共SecretData属性会自动带上[JsonIgnore] [ObservableProperty(JsonIgnore = true)] private string _secretData; }
方法2:手动给生成的公共属性补充特性
由于ViewModel是部分类,你可以在同一个类的另一部分手动声明公共属性并添加序列化特性,同时保留源生成器的SetProperty逻辑:
using CommunityToolkit.Mvvm.ComponentModel; using System.Text.Json.Serialization; public partial class MyViewModel : ObservableObject { private string _secretData; // 自定义序列化规则,比如仅当值为默认值时忽略 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string SecretData { get => _secretData; set => SetProperty(ref _secretData, value); } }
这种方式适合需要更精细序列化控制的场景,比如区分序列化/反序列化的忽略规则。
方法3:自定义JsonConverter(全局控制)
如果需要对多个属性或整个类型的序列化规则做统一控制,可以编写自定义JsonConverter,在其中指定要忽略的属性:
using System.Text.Json; using System.Text.Json.Serialization; public class MyViewModelConverter : JsonConverter<MyViewModel> { public override MyViewModel Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var model = new MyViewModel(); // 按需读取反序列化需要的属性 return model; } public override void Write(Utf8JsonWriter writer, MyViewModel value, JsonSerializerOptions options) { writer.WriteStartObject(); // 只序列化需要的属性,跳过要忽略的字段 writer.WriteString("PublicData", value.PublicData); writer.WriteEndObject(); } }
使用时在序列化选项中添加该转换器:
var options = new JsonSerializerOptions(); options.Converters.Add(new MyViewModelConverter()); string json = JsonSerializer.Serialize(viewModel, options);
这种方式适合复杂场景,但实现成本较高。
内容的提问来源于stack exchange,提问作者Saiteja Rangi
相关产品推荐
相关产品推荐

