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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:20:42