C# RESTful API的反序列化错误
说错话 JsonReaderException:分析值时遇到意外字符:M.Path',第0行,位置0 当尝试解析JSON响应时(不是全部,而是前几项,我在xxxxxx中更改了匿名性): 以下是我的部分代码:C# RESTful API的反序列化错误,c#,.net,json,asp.net-core,.net-core,C#,.net,Json,Asp.net Core,.net Core,说错话 JsonReaderException:分析值时遇到意外字符:M.Path',第0行,位置0 当尝试解析JSON响应时(不是全部,而是前几项,我在xxxxxx中更改了匿名性): 以下是我的部分代码: if(response.IsSuccessStatusCode) { ViewBag.Msg = "Success"; var stresult = await response.Content.ReadAsStringAsync();
if(response.IsSuccessStatusCode)
{
ViewBag.Msg = "Success";
var stresult = await response.Content.ReadAsStringAsync();
var flogs = JsonConvert.DeserializeObject<List<EmailLog>>(stresult);
logs = flogs.ToList();
}
这是我第一次使用RESTfulAPI和JSON,所以我可能错过了一些简单的东西
编辑:
这是我发出API请求的完整控制器代码:
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://api:key-xxxxxxxxxxxxxxxxxxxxxxxxxxxx@api.mailgun.net/v3");
List<EmailLog> logs = new List<EmailLog>();
HttpResponseMessage response = await client.GetAsync("/mg.xxxxx.ca/log");
if (response.IsSuccessStatusCode)
{
// var stresult = await response.Content.ReadAsStringAsync();
// var flogs = JsonConvert.DeserializeObject<List<EmailLog>>(stresult);
// logs = flogs.ToList();
var json = await response.Content.ReadAsStringAsync();
var jObject = JObject.Parse(json);
if (jObject.ContainsKey("items"))
{
ViewBag.Msg = "Success";
logs = jObject["items"].ToObject<List<EmailLog>>();
}
//var logs = JsonConvert.DeserializeObject<ApiResponse>(json);
}
else { ViewBag.Msg = "Fail"; }
return View(logs);
HttpClient=newhttpclient();
client.BaseAddress=新Uri(“https://api:key-xxxxxxxxxxxxxxxxxxxxxxxxxxxx@api.mailgun.net/v3”);
列表日志=新列表();
httpresponsemessageresponse=wait client.GetAsync(“/mg.xxxxx.ca/log”);
if(响应。IsSuccessStatusCode)
{
//var stresult=await response.Content.ReadAsStringAsync();
//var flogs=JsonConvert.DeserializeObject(stresult);
//logs=flogs.ToList();
var json=await response.Content.ReadAsStringAsync();
var jObject=jObject.Parse(json);
if(jObject.ContainsKey(“项目”))
{
ViewBag.Msg=“成功”;
logs=jObject[“items”].ToObject();
}
//var logs=JsonConvert.DeserializeObject(json);
}
else{ViewBag.Msg=“Fail”;}
返回视图(日志);
问题在于试图直接获取EmailLog
对象的列表,因为它们包含在json响应的“items”元素中
您可以使用包装器类来解决此问题,例如:
public class ApiResponse
{
[JsonProperty(PropertyName = "total_count")]
public int TotalCount { get; set; }
[JsonProperty(PropertyName = "items")]
public List<EmailLog> Items { get; set; }
}
公共类响应
{
[JsonProperty(PropertyName=“总数”)]
公共整数TotalCount{get;set;}
[JsonProperty(PropertyName=“items”)]
公共列表项{get;set;}
}
然后不需要使用列表来反序列化:
var flogs = JsonConvert.DeserializeObject<ApiResponse>(json);
var-flogs=JsonConvert.DeserializeObject(json);
这里是创建根对象的替代方法,如另一个答案中所述
这种方法利用了JSON.Net提供的Linq To JSON,它用于反序列化JSON
if(response.IsSuccessStatusCode) {
ViewBag.Msg = "Success";
var json = await response.Content.ReadAsStringAsync();
var jObject = JObject.Parse(json);
if (jObject.ContainsKey("items"))
logs = jObject["items"].ToObject<List<EmailLog>>();
}
这将匹配试图解析M时抛出的无效字符异常,因为它显然不是格式良好的JSON
查看了Mailgun文档后,您使用的URL似乎只能在浏览器中使用,而不是用于HttpClient
类
建议使用基本授权发出请求
比如说
var myMailgunDomain = "https://api.mailgun.net/v3/mg.xxxxx.ca/";
var client = new HttpClient() {
BaseAddress = new Uri(myMailgunDomain)
};
var apiKey = "api:key-xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var parameter = Convert.ToBase64String(Encoding.ASCII.GetBytes(apiKey));
client.DefaultRequestHeaders
.Authorization = new AuthenticationHeaderValue("Basic", parameter);
HttpResponseMessage response = await client.GetAsync("log");
//...
这个答案更适合我的情况,谢谢您仍然收到相同的错误消息,要尝试另一个solution@dave317重新检查返回的JSON字符串,查看异常消息,如果该字符串以字符串开头的无效字符(位置0)开头,则该字符串将成为无效JSON,因此出现了错误。确认返回的JSON是有效的JSON。如何检查?如果我在浏览器中输入我的Uri并进行查询,它会显示我粘贴到上面问题中的JSON。@dave317能否显示更多请求数据的代码?我假设您使用的是
HttpClient
,而response
是HttpResponseMessage
if(response.IsSuccessStatusCode) {
ViewBag.Msg = "Success";
var json = await response.Content.ReadAsStringAsync();
var jObject = JObject.Parse(json);
if (jObject.ContainsKey("items"))
logs = jObject["items"].ToObject<List<EmailLog>>();
}
"Mailgun Magnificent API"
var myMailgunDomain = "https://api.mailgun.net/v3/mg.xxxxx.ca/";
var client = new HttpClient() {
BaseAddress = new Uri(myMailgunDomain)
};
var apiKey = "api:key-xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var parameter = Convert.ToBase64String(Encoding.ASCII.GetBytes(apiKey));
client.DefaultRequestHeaders
.Authorization = new AuthenticationHeaderValue("Basic", parameter);
HttpResponseMessage response = await client.GetAsync("log");
//...