我收到了JSON格式的回复。我正在使用jsSerializer从JSON获取字段的值。它在大多数情况下都有效,但我不确定为什么在一种情况下回来的JSON中有\n
,因此jsSerializer无效。
这是我的代码:
protected void btnStats_Click(object sender, EventArgs e)
{
IRestResponse response = GetStats();//Stats provide you with the summary of the events that occur with your messages.
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
var jsobj = jsSerializer.Deserialize<dynamic>(response.Content);
int total_count= Convert.ToInt32(jsobj[0]["total_count"]); //I am getting error
这是返回JSON的方法:
public static IRestResponse GetStats()
{
RestClient client = new RestClient();
client.BaseUrl = "https://api.mailgun.net/v2";
client.Authenticator =
new HttpBasicAuthenticator("api",
"key");
RestRequest request = new RestRequest();
request.AddParameter("domain",
"messenger.test.com", ParameterType.UrlSegment);
request.Resource = "{domain}/stats";
request.AddParameter("event", "sent");
request.AddParameter("event", "opened");
request.AddParameter("skip", 1);
request.AddParameter("limit", 2);
return client.Execute(request);
}
我有一些正常工作的方法,但我发现的唯一区别是(response.Content
)中的JSON格式有\n
。我没有做任何事情来移除\n
;它只是不存在。
这是我从该代码获得的JSON:
"{\n \"total_count\": 54,\n \"items\": [\n {\n \"total_count\": 715,\n \"created_at\": \"Mon, 04 Nov 2013 00:00:00 GMT\",\n \"tags\": {},\n \"id\": \"5276e3835b8917d8268a6df1\",\n \"event\": \"opened\"\n },\n {\n \"total_count\": 688,\n \"created_at\": \"Sun, 03 Nov 2013 00:00:00 GMT\",\n \"tags\": {},\n \"id\": \"527592035b8917d8268a1348\",\n \"event\": \"sent\"\n }\n ]\n}"
并且在另一种正常工作的方法中,我得到了这种JSON:
"[{\"unique\": {\"link\": 1}, \"total\": 35, \"recipient\": \"cutesycanvas@gmail.com\"}, {\"unique\": {\"link\": 1}, \"total\": 22, \"recipient\": \"angelina40d@hotmail.com\"}]"
答案 0 :(得分:1)
格式化的JSON字符串可以在其中包含换行符和其他空格格式。这将在Visual Studio调试器中显示为\n
。
它将解析为没有额外空格的JSON字符串。
错误在您的代码中,而不在JSON中。您正尝试在动态值上使用索引器。但动态值不是数组,因此它不支持索引器。这是一个对象。您必须手动访问属性,例如:
jsobj["total_count"]
您列出的第一个JSON字符串是一个带有“items”子数组的对象。因此,您可以编写jsobj["items"][0]
来访问该数组中的第一个对象(如果至少有一个对象)。
您发布的第二个JSON字符串不是包装在对象中的数组,它只是一个数组。
您可能希望反序列化为强类型对象而不是动态对象。使用动态更加懒惰,因为它不会验证JSON是否符合您期望的格式。如果您的JSON格式错误,您希望在反序列化期间出错,而不是在以后的某个时间点。
因此我会创建一个如下对象:
public class SomeResult
{
public int total_count { get; set; }
public List<SomeItem> items { get; set; }
}
public class SomeItem
{
public int total_count { get; set; }
public DateTime created_at { get; set; }
...
}
然后你可以写:
SomeResult result = serializer.Deserialize<SomeResult>(response.Content);
现在你有一个强类型的类,你可以访问所有的结果。
请记住,名称需要精确制作,并且您使用的类型必须与反序列化的类型值匹配。例如,如果DateTime可能为null,则必须使用可为空的DateTime(DateTime?
)。