使用C#调用Mongo Atlas Data API时EJSON语法问题求解
解决C#调用Mongo Atlas Data API时$开头属性的语法问题
C#中匿名类型的属性名不能以$开头,这是语法层面的限制,针对你的场景,有两种常用的解决方式:
方法一:使用Dictionary<string, object>构建请求体
用字典替代匿名类型,键可以自由定义为带$的字符串,完美适配API要求的EJSON格式:
var updateDict = new Dictionary<string, object> { ["$set"] = new Dictionary<string, object> { ["contactFirstName"] = contact.Firstname, ["contactLastName"] = contact.Lastname, ["contactEmail"] = contact.Email, ["version"] = "1.0", ["dateUpdated"] = new Dictionary<string, object> { ["$date"] = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ") } } }; var data = new { dataSource = ClusterName, database = "mydb", collection = "contact", filter = new { contactSalesforceReference = contact.AccountId }, update = updateDict, upsert = false };
注意:日期格式建议用UTC时间并输出Z结尾的标准格式,避免时区解析错误。
方法二:定义强类型类并使用JsonPropertyName特性
如果偏好强类型开发,可以创建对应的数据类,通过JsonPropertyName特性指定JSON序列化后的键名(需引用System.Text.Json命名空间):
using System.Text.Json.Serialization; public class UpdateRequest { [JsonPropertyName("$set")] public SetData Set { get; set; } } public class SetData { public string contactFirstName { get; set; } public string contactLastName { get; set; } public string contactEmail { get; set; } public string version { get; set; } public DateUpdated dateUpdated { get; set; } } public class DateUpdated { [JsonPropertyName("$date")] public string DateValue { get; set; } } // 使用示例 var data = new { dataSource = ClusterName, database = "mydb", collection = "contact", filter = new { contactSalesforceReference = contact.AccountId }, update = new UpdateRequest { Set = new SetData { contactFirstName = contact.Firstname, contactLastName = contact.Lastname, contactEmail = contact.Email, version = "1.0", dateUpdated = new DateUpdated { DateValue = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ") } } }, upsert = false };
序列化时,System.Text.Json会自动将属性转换为带$的键名,完全匹配API的EJSON要求。
额外提示
- 发送请求时,需将请求头的
Content-Type设置为application/ejson或application/json(EJSON是JSON的扩展,主流序列化工具均兼容)。 - 日期的EJSON格式也支持时间戳形式,比如:
["$date"] = new Dictionary<string, object> { ["$numberLong"] = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString() }
内容的提问来源于stack exchange,提问作者David Hirst
相关产品推荐
相关产品推荐

