JsonProperty用于Newtonsoft.Json库中指定JSON字段名,System.Text.Json需用JsonPropertyName;它只重命名字段,不控制序列化与否,禁用需JsonIgnore或DefaultValueHandling。
JsonProperty 用在哪?不是所有 JSON 序列化场景都认它
jsonproperty 是 newtonsoft.json(即 json.net)里的属性,不是 .net 原生 system.text.json 的。如果你用的是 .net core 3.0+ 默认的 system.text.json,加 [jsonproperty("xxx")] 完全没效果——它直接被忽略。
- 确认你引用的是
Newtonsoft.Json(NuGet 包名:Newtonsoft.Json),且类上用了[JsonObject]或至少序列化器是JsonConvert.SerializeObject - 如果项目已迁移到
System.Text.Json,对应写法是[JsonPropertyName("xxx")],来自命名空间System.Text.Json.Serialization - 混用两种库时,别在同一个类里同时写
[JsonProperty]和[JsonPropertyName],运行时不会报错,但只有对应序列化器会读取它
JsonProperty("name") 的引号里能写啥?别填空或纯数字
引号里填的是最终生成 JSON 时字段的 key 名,它必须是合法的 JSON 字符串。常见翻车点:
- 写成
[JsonProperty("user id")]—— 空格本身合法,但很多下游 API 会拒绝带空格的 key,建议用下划线或驼峰:"user_id" - 写成
[JsonProperty("123field")]—— 数字开头不违法 JSON,但某些前端解析库(如旧版 jQuery)可能出问题,稳妥起见避免纯数字或数字开头 - 写成
[JsonProperty("")]—— 空字符串作为 key 在 JSON 中语法合法,但Newtonsoft.Json默认会抛JsonSerializationException,提示 “Cannot serialize a null or undefined value to JSON”
想让某个字段不序列化?别只靠 JsonProperty
[JsonProperty] 本身不能控制“是否参与序列化”,它只管重命名。要跳过字段,得配合其他属性:
- 加
[JsonIgnore]:彻底不序列化也不反序列化该字段 - 加
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]:值等于默认值(如null、0、false)时跳过 - 注意
[JsonProperty(Required = Required.Always)]是反序列化约束,不影响序列化行为;如果反序列化时缺失该字段,会抛异常,但和“要不要输出”无关
JsonProperty 和 private 字段/自动属性初始化器冲突吗?
不冲突,但要注意访问权限和初始化时机:
- 给
private字段加[JsonProperty]是有效的,只要序列化器开启了BindingFlags.NonPublic(JsonConvert.SerializeObject默认开启) - 如果字段有自动属性初始化,比如
public string Name { get; set; } = "default";,那么即使没赋值,序列化时也会输出"Name": "default"——[JsonProperty]不改变这个行为 - 别在
get方法里做耗时计算再加[JsonProperty],因为每次序列化都会触发 getter,可能引发意外副作用或性能问题
using Newtonsoft 和 using System.Text.Json 各出现几次,比猜靠谱得多。


















