C# SendGrid:未填充对象的电子邮件活动API JSON响应的反序列化
我使用REST客户端调用SendGrid的电子邮件活动API,它通过标准JSON响应正确返回数据 但是,我希望将其反序列化为C#对象,因为它比原始JSON字符串更容易处理。因此,我创建了一个C#类,该类在JSON响应中具有每个字段的公共属性,并为它们提供带有JSON字段确切名称的注释 但是,当我调用JsonDeserializer().Deserialize>(响应)时,虽然没有错误/异常,但对象中的所有字段都为空 你知道怎么了吗?(您可以去掉“EventType”引用,因为它在这里并不真正相关)。相关代码如下 我使用的是RestSharp v106.6.10.0和Newtonsoft.Json v9.0.0.0(后者可能更老,但这是我们通常使用的库)。 项目是.NETV4.6.1C# SendGrid:未填充对象的电子邮件活动API JSON响应的反序列化,c#,json,sendgrid,restsharp,sendgrid-api-v3,C#,Json,Sendgrid,Restsharp,Sendgrid Api V3,我使用REST客户端调用SendGrid的电子邮件活动API,它通过标准JSON响应正确返回数据 但是,我希望将其反序列化为C#对象,因为它比原始JSON字符串更容易处理。因此,我创建了一个C#类,该类在JSON响应中具有每个字段的公共属性,并为它们提供带有JSON字段确切名称的注释 但是,当我调用JsonDeserializer().Deserialize>(响应)时,虽然没有错误/异常,但对象中的所有字段都为空 你知道怎么了吗?(您可以去掉“EventType”引用,因为它在这里并不真正相关
private void QuerySendGridForEmailActivity(EventType eventType)
{
string query = string.Empty;
RestClient client = null;//new RestClient(emailActivityEndpoint);
RestRequest request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer " + apiKey);
request.AddParameter("limit", "1000");
if (eventType == EventType.Opens)
{
// request.AddParameter("query", WebUtility.UrlEncode("(Contains(events,\"open\"))"));
client = new RestClient(emailActivityEndpoint + "?limit=10&query=" + System.Web.HttpUtility.UrlPathEncode("(Contains(events,\"open\"))"));
}
IRestResponse response = client.Execute(request);
if (response != null && response.StatusCode == HttpStatusCode.OK)
{
this.emailActivityEvents = new JsonDeserializer().Deserialize<List<EmailActivityEvent>>(response);
int i = 0;
}
else
{
}
}
public class EmailActivityEvent
{
[DeserializeAs(Name = "from_email")]
public string FromEmail { get;set; }
[DeserializeAs(Name = "msg_id")]
public string MessageId { get; set; }
[DeserializeAs(Name = "subject")]
public string Subject { get; set; }
[DeserializeAs(Name = "to_email")]
public string ToEmail { get; set; }
[DeserializeAs(Name = "status")]
public string Status { get; set; }
[DeserializeAs(Name = "opens_count")]
public int OpensCount { get; set; }
[DeserializeAs(Name = "clicks_count")]
public int ClicksCount { get; set; }
[DeserializeAs(Name = "last_event_time")]
public DateTime LastEventTime { get; set; }
}
private void querySendGridForMailActivity(EventType EventType)
{
string query=string.Empty;
RestClient=null;//新建RestClient(emailActivityEndpoint);
RestRequest请求=新的RestRequest(Method.GET);
请求.AddHeader(“授权”、“承载人”+apiKey);
请求。添加参数(“限制”、“1000”);
if(eventType==eventType.Opens)
{
//request.AddParameter(“query”,WebUtility.UrlEncode((包含(事件,\“打开”)));
client=new RestClient(emailActivityEndpoint+“?limit=10&query=“+System.Web.HttpUtility.UrlPathEncode”((包含(事件,\'open\”)));
}
IRestResponse response=client.Execute(请求);
if(response!=null&&response.StatusCode==HttpStatusCode.OK)
{
this.emailActivityEvents=新的JsonDeserializer()。反序列化(响应);
int i=0;
}
其他的
{
}
}
公共类EmailActivityEvent
{
[反序列化(Name=“from_email”)]
电子邮件{get;set;}中的公共字符串
[反序列化(Name=“msg_id”)]
公共字符串MessageId{get;set;}
[反序列化(Name=“subject”)]
公共字符串主题{get;set;}
[反序列化(Name=“to_email”)]
公共字符串ToEmail{get;set;}
[反序列化(Name=“status”)]
公共字符串状态{get;set;}
[反序列化(Name=“opens\u count”)]
public int openscont{get;set;}
[反序列化(Name=“clicks\u count”)]
public int clickScont{get;set;}
[反序列化(Name=“last\u event\u time”)]
公共日期时间LastEventTime{get;set;}
}
好的,我本应该早点拿到,但我认为我不需要这么做
我不得不添加另一个名为“EmailActivity”的类,它只有一个电子邮件事件列表,带有一个反序列化注释,与JSON中项目的实际名称相匹配。像这样:
public class EmailActivity
{
[DeserializeAs(Name = "messages")]
public List<EmailActivityEvent> Events { get; set; }
}
谢谢你的评论 我不使用RestSharp,但通常需要访问响应的内容,而不是主体负载的响应本身。是的,这是有道理的,但RestSharp JsonDeserializer确实需要一个IRestResponse对象。我只是尝试在使用旧版本时更新Newtonsoft.Json,但似乎没有任何效果。该死。谢谢你的回复!尝试使用类型化()客户端反序列化
response.Content
,而不是像示例中那样反序列化response
var emailActivity = new JsonDeserializer().Deserialize<EmailActivity>(response);
{"messages":
[{
"from_email":"from@email.com",
"msg_id":"msgid",
"subject":"Test",
"to_email":"to@email.com",
"status":"delivered",
"opens_count":0,
"clicks_count":0,
"last_event_time":"2019-11-26T20:30:02Z"
},
{
"from_email":"from@email.com",
"msg_id":"msgid",
"subject":"Test",
"to_email":"to@email.com",
"status":"delivered",
"opens_count":0,
"clicks_count":0,
"last_event_time":"2019-11-26T20:30:01Z"
},
{
"from_email":"from@email.com",
"msg_id":"msgid",
"subject":"Test",
"to_email":"to@email.com",
"status":"delivered",
"opens_count":0,
"clicks_count":0,
"last_event_time":"2019-11-25T22:06:25Z"
}
]}