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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:25:28