C#使用JsonConvert序列化时如何将object作为属性名使用
解决方法
方法1:使用@转义关键字(最简方案,适配匿名类场景)
C# 中如果需要将保留关键字用作变量、属性名等标识符,只需要在关键字前添加 @ 前缀即可,编译器会自动识别为普通标识符,且 Newtonsoft.Json 序列化时会自动忽略前缀,输出的 JSON 键名就是正常的 object。
修改后的代码如下:
var message = JsonConvert.SerializeObject(new { sessionid = guid.ToString(), personnelNumber = Environment.UserName, name = user.DisplayName, activity = Activity, @object = Object, // @前缀转义关键字 time = DateTime.Now, timespan = TimeSpan });
序列化后的结果中会自动生成键为"object"的字段,完全符合接口参数要求。
方法2:使用自定义实体类加JsonProperty特性
如果该请求结构需要在多处复用,可以自定义序列化实体类,避免频繁写转义符:
首先定义实体类:
public class ApiPostMessage { public string sessionid { get; set; } public string personnelNumber { get; set; } public string name { get; set; } public string activity { get; set; } [JsonProperty("object")] // 显式指定序列化后的键名 public string ObjectContent { get; set; } // 使用非关键字的属性名即可 public DateTime time { get; set; } public TimeSpan timespan { get; set; } }
序列化时使用该类实例即可:
var message = JsonConvert.SerializeObject(new ApiPostMessage { sessionid = guid.ToString(), personnelNumber = Environment.UserName, name = user.DisplayName, activity = Activity, ObjectContent = Object, time = DateTime.Now, timespan = TimeSpan });
方法3:使用字典构造序列化对象
如果不想定义实体类也不想用转义符,可以直接用字典结构,键名直接写字符串即可,完全避开关键字冲突问题:
var postData = new Dictionary<string, object> { ["sessionid"] = guid.ToString(), ["personnelNumber"] = Environment.UserName, ["name"] = user.DisplayName, ["activity"] = Activity, ["object"] = Object, ["time"] = DateTime.Now, ["timespan"] = TimeSpan }; var message = JsonConvert.SerializeObject(postData);
内容的提问来源于stack exchange,提问作者EyeSeeSharp
相关产品推荐
相关产品推荐

