反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣
Posted
技术标签:
【中文标题】反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣【英文标题】:Deserialize merge-fields and interests that have different names in different MailChimp lists 【发布时间】: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_id
、tag
和name
,还是只想知道每个成员的所有合并字段的值?
抱歉不准确。如果可能的话,我想两者兼得,但最重要的是价值观。因为我可以通过 list//merge-field 调用获取合并字段的名称、标签和 ID。
【参考方案1】:
您可以将Dictionary<string, object>
类型用于合并字段,将Dictionary<string, bool>
类型用于兴趣。这是您的 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
,即FNAME
、LNAME
,因此无法使用/lists/list_id/members
端点获取合并字段的name
和merge_id
等。您需要单独调用/lists/list_id/merge-fields
端点并比较每个合并字段的tag
以获得相关的name
和merge_id
。
【讨论】:
以上是关于反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣的主要内容,如果未能解决你的问题,请参考以下文章
当对象具有不同的serialVersionUID时,如何反序列化保存在数据库中的对象