【问题标题】:Deserialize merge-fields and interests that have different names in different MailChimp lists反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣
【发布时间】:2017-05-27 13:58:43
【问题描述】:

在反序列化以下 json 响应时,我设法获取订阅者 ID、电子邮件和状态,这很容易,因为这些名称始终相同,并且不依赖于列表中的特定设置。但是如何反序列化合并字段和在不同列表中具有不同名称的兴趣?

{ "members": [ {
    "id": "f777bbffab8d1ceca8b757df63c47cb8",
    "email_address": "urist.mcvankab+1@freddiesjokes.co",
    "unique_email_id": "882e9bec19",
    "status": "subscribed",
    "merge_fields":{
        "FNAME": "",
        "LNAME": "" },
    "interests":{
        "9143cf3bd1": true,
        "3a2a927344": false,
        "f9c8f5f0ff": false,
        "f231b09abc": true,
        "bd6e66465f": false },
//And so on...

如何更改我的类以反序列化响应?

我的会员班

public class Member
{
    public string id { get; set; }
    public string email_address { get; set; }
    public string status { get; set; }
    //public List<MergeField> mergeFields { get; set; }
    //public List<Interests> interests { get; set; }
}

MergeField 指的是我的旧 MergeField 类,其中的字段是硬编码的

public class MergeField
{
    public string FNAME { get; set; }
    public string LNAME { get; set; }
    public string ADDRESS { get; set; }
    public string MERGE4 { get; set; }
}

但我想在请求列表的合并字段时使用相同的两个 Mergefield(s) 类来反序列化 json 响应。

public class MergeFields
{
    public List<Mergefield> merge_fields { get; set; }
    public string list_id { get; set; }
    public int total_items { get; set; }
}

public class Mergefield
{
    public string merge_id { get; set; }
    public string tag { get; set; }
    public string name { get; set; }
    public string list_id { get; set; }
}

我找到了这个答案How do deserialize JSON with non-standard (and varying) property names,但我不知道如何在我的场景中使用它。

【问题讨论】:

  • 您真的需要每个合并字段的merge_idtagname,还是只想知道每个成员的所有合并字段的值?
  • 抱歉不准确。如果可能的话,我想两者兼得,但最重要的是价值观。因为我可以通过 list//merge-field 调用获取合并字段的名称、标签和 ID。

标签: c# json json-deserialization mailchimp-api-v3.0


【解决方案1】:

您可以将Dictionary&lt;string, object&gt; 类型用于合并字段,将Dictionary&lt;string, bool&gt; 类型用于兴趣。这是您的 Member 课程的外观

public class Member
{
    public string id { get; set; }
    public string email_address { get; set; }
    public string status { get; set; }
    public Dictionary<string, object> merge_fields { get; set; }
    public Dictionary<string, bool> interests { get; set; }
}

假设您使用MemberResponse 类作为响应,如下所示

public class MemberResponse
{
    public List<Member> members { get; set; }
    public string list_id { get; set; }
    public int total_items { get; set; }
}

这是获取每个合并字段和兴趣值的方法

MemberResponse memberResponse = .... // your code that calls the API

// enumerate members
foreach (var member in memberResponse.members)
{
    // enumerate merge fields
    foreach (var key in member.merge_fields.Keys)
    {
        // when key = "FNAME", value would be the first name of the member
        // when key = "LNAME", value would be the last name of the member
        string value = member.merge_fields[key].ToString();
    }

    // enumerate interests
    foreach (var key in member.interests.Keys)
    {
        // when key = "9143cf3bd1", value would be true
        // when key = "3a2a927344", value would be false
        // ... and so on
        bool value = member.interests[key];
    }

}

不幸的是,由于响应正文只包含合并字段的tag,即FNAMELNAME,因此无法使用/lists/{list_id}/members端点获取合并字段的namemerge_id等。您需要单独调用/lists/{list_id}/merge-fields 端点并比较每个合并字段的tag 以获得相关的namemerge_id

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 2015-03-24
    • 2019-11-02
    • 2013-09-16
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多