如何从变量创建动态 JSON 密钥?

问题描述

我们的电子学习平台使用名为 SendGrid 的第三方电子邮件服务来发送我们的电子邮件。我们将一个 JSON 对象传递给平台,我们的模板使用 Handlebars 动态填充来自 JSON 对象的值。

我们传递的典型 JSON 对象如下所示:

{
   "To": "abc@xyz.com","From": "zxy@abc.com","Subject": "Online Course","TemplateData": {
      "CourseName": "Course 1","LoginPage": "https://www.login.com"
   }   
}

我们开始实施多语言支持。我们可以将 Handlebars 添加到我们的模板中以执行条件 if-then 语句,以根据传入的语言动态填充正确的翻译文本。 所以我设想使用我们传入的语言向 TemplateData 添加一个新的 Language 键,如如下:

"TemplateData": {
      "CourseName": "Course 1","Language": "en-US","LoginPage": "https://www.login.com"
   }   

不幸的是,我意识到他们在 Handlebars 中的 if-else 条件只支持布尔比较,所以它必须看起来像这样:

"TemplateData": {
      "CourseName": "Course 1","en-US": true
      "LoginPage": "https://www.login.com"
   }   

由于语言部分(例如 en-US、en-CA、fr-FR 等)是从存储过程传入​​的变量,因此我不能仅在对象定义中静态设置语言键。

反序列化后的对象如下:

public abstract class CpiEmailMessage : IEmailMessage
{
   public string To { get; protected set; }
   protected static string FromEmail => "noreply@cpilearning.com";
   protected static string FromName => "CPI Learning";

   protected Dictionary<string,string> CustomArgs(int emailLogId) => new 
                      Dictionary<string,string>
   {
       { "SystemSource","HoneyBee.Integrations" },{ "Env",ConfigurationManager.AppSettings.Get("Env") },{ "EmailLogId",$"{emailLogId}" }
   };

   public abstract EmailSendRequest ToEmailSendRequest(int emailLogId);
   public abstract EmailLog ToLogEmailCommandRequest(int currentUser,bool sent);
 }

public class PurchaseEmailMessage : CpiEmailMessage
{
    private string Subject { get; }
    public string CourseName { get; }
    public string CourseLanguage { get; set; }
    public string LoginPage { get; set; }
    
    public string Url { get; }
    public string OnlineOnly { get; }

    private static EmailType MessageTemplateKey => EmailType.PURCHASE;

 public PurchaseEmailMessage(string to,string subject,string courseName,string courseLanguage,string loginPage,string cmsURL,string onlineOnly)
 {
      To = to;
      Subject = subject;
      CourseName = courseName;
      CourseLanguage = courseLanguage;
      LoginPage = loginPage;
      Url= cmsURL;
      OnlineOnly = onlineOnly;
  }

  public override EmailSendRequest ToEmailSendRequest(int emailLogId)
  {
       return new EmailSendRequest
       {
            To = To,FromEmail = FromEmail,FromName = FromName,Subject = Subject,MessageTemplateKey = MessageTemplateKey,TemplateData = new
            {
                Course = CourseName,LoginUrl = LoginPage
            },CustomArgs = CustomArgs(emailLogId),EmailLogId = emailLogId,Categories = new List<string> { "Seat Purchase" }
        };
    }
}

如何获取语言变量 (en-US) 并使其成为 TemplateData 中具有“true”值的键?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)