C# RESTful API的反序列化错误

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();

说错话

JsonReaderException:分析值时遇到意外字符:M.Path',第0行,位置0

当尝试解析JSON响应时(不是全部,而是前几项,我在xxxxxx中更改了匿名性):

以下是我的部分代码:

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");
//...