使用Json.net将Json转换为C#对象
我搜索了很多网站,并在我的web服务器上部署了各种解决方案,结果发现迄今为止我所遇到的一切都不起作用。我有以下JSON:使用Json.net将Json转换为C#对象,c#,json,asp.net-mvc,api,json.net,C#,Json,Asp.net Mvc,Api,Json.net,我搜索了很多网站,并在我的web服务器上部署了各种解决方案,结果发现迄今为止我所遇到的一切都不起作用。我有以下JSON: ["{\"EntryNo\":4,\"Title\":\"New Title\",\"Summary\":\"New Summary\",\"Body\":\"New Body\",\"CreatedOn\":\"2017-03-03T03:53:16.2955903+00:00\",\"CreatedBy\":\"Jim Jones\",\"ModifiedBy\":\"J
["{\"EntryNo\":4,\"Title\":\"New Title\",\"Summary\":\"New Summary\",\"Body\":\"New Body\",\"CreatedOn\":\"2017-03-03T03:53:16.2955903+00:00\",\"CreatedBy\":\"Jim Jones\",\"ModifiedBy\":\"Jim Jones\",\"ModifiedOn\":\"2017-02-25T07:06:32.517\",\"Deleted\":false,\"TypeId\":1}",
"{\"EntryNo\":5,\"Title\":\"Old Title\",\"Summary\":\"Old Summary\",\"Body\":\"Old Body\",\"CreatedOn\":\"2017-03-03T03:53:16.2955903+00:00\",\"CreatedBy\":\"Ben Jones\",\"ModifiedBy\":\"Ben Jones\",\"ModifiedOn\":\"2017-02-25T07:06:32.593\",\"Deleted\":false,\"TypeId\":1}"
]
我的模型如下所示:
public class BlogVM
{
[JsonProperty(PropertyName = "EntryNo")]
public int EntryNo { get; set; }
[JsonProperty(PropertyName = "Title")]
public string Title { get; set; }
[JsonProperty(PropertyName = "Summary")]
public string Summary { get; set; }
[JsonProperty(PropertyName = "Body")]
public string Body { get; set; }
[JsonProperty(PropertyName = "CreatedOn")]
public DateTime CreatedOn { get; set; }
[JsonProperty(PropertyName = "ModifiedOn")]
public DateTime ModifiedOn { get; set; }
[JsonProperty(PropertyName = "CreatedBy")]
public string CreatedBy { get; set; }
[JsonProperty(PropertyName = "ModifiedBy")]
public string ModifiedBy { get; set; }
[JsonProperty(PropertyName = "Deleted")]
public bool Deleted { get; set; }
[JsonProperty(PropertyName = "TypeId")]
public int? TypeId { get; set; }
}
我的控制器方法是一个大杂烩
public async Task<ActionResult> _ActualBlogContent()
{
HttpClient client = new HttpClient();
client.BaseAddress = new System.Uri("wwww.myapiaddresshere.com");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.GetAsync("api/entry/").Result;
if (response.IsSuccessStatusCode)
{
var dataObjects = response.Content.ReadAsStringAsync();
List<BlogVM> pdone = JsonConvert.DeserializeObject<List<BlogVM>>(dataObjects.Result);
}
return View();
}
public异步任务\u ActualBlogContent()
{
HttpClient=新的HttpClient();
client.BaseAddress=newsystem.Uri(“www.myapiaddresshere.com”);
client.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/json”);
httpresponsemessageresponse=client.GetAsync(“api/entry/”).Result;
if(响应。IsSuccessStatusCode)
{
var dataObjects=response.Content.ReadAsStringAsync();
List pdone=JsonConvert.DeserializeObject(dataObjects.Result);
}
返回视图();
}
我收到一条错误消息:
无法从System.String强制转换或转换为Models.Blog.BlogVM
我错过了什么?此外,fwiw json2Csharp不起作用。我传递的所有json都失败了……但是如果我在jsonlint.com上验证son,它就会通过验证测试
我真的很困惑这里缺少什么。我只是错误地使用了这个框架吗?我认为你的JSON没有你想象的那么好。我无法获得您发布的内容以通过验证,因为在不同的地方有一些错误的引用 我运行了你发布的内容,它给了我各种各样的错误,包括它需要字符串的错误。这是因为一开始就出现了
[“{
”。反序列化时,它需要一个大括号({
),但您给了它一个引号(“
),因此出现了错误消息。在类似这样的地方,需要大括号,但找到了引号
下面是一些经过清理的JSON。这应该可以反序列化
[
{
"EntryNo":4,
"Title":"New Title",
"Summary":"New Summary",
"Body":"New Body",
"CreatedOn":"2017-03-03T03:53:16.2955903+00:00",
"CreatedBy":"Jim Jones",
"ModifiedBy":"Jim Jones",
"ModifiedOn":"2017-02-25T07:06:32.517",
"Deleted":false,
"TypeId":1
},
{
"EntryNo":5,
"Title":"Old Title",
"Summary":"Old Summary",
"Body":"Old Body",
"CreatedOn":"2017-03-03T03:53:16.2955903+00:00",
"CreatedBy":"Ben Jones",
"ModifiedBy":"Ben Jones",
"ModifiedOn":"2017-02-25T07:06:32.593",
"Deleted":false,
"TypeId":1
}
]
问题的真正根源在于格式错误的JSON来自何处。为什么不
等待响应。Content.ReadAsStringAsync()
。这是您将该方法设置为异步任务的唯一原因。现在我假设您没有得到预期的结果。直接在控制器上进行API调用。将其放入服务类,并让它实现一个公开所需方法的接口。然后让您的类通过在其构造函数中获取一个实例。并让依赖项注入将您的服务类的一个实例插入控制器。@mason这与关于JSON序列化错误的问题毫无关系。@Eric本不打算回答所问的问题,否则我会把它放在答案中。不过这是一个很好的建议。如果有人做了一些愚蠢的事情,应该告诉他们。或者你建议我们只解决被问到的问题吗?我们是否应该指出SQL注入攻击,即使问题可能与此无关?我已经有一段时间了,我想我会继续帮助推广良好做法,谢谢。如果他有困惑,欢迎他这么说。同时,让我们不要把评论和猜测混为一谈,不要猜测某人可能会困惑,也不要猜测就他们没有询问的事情向某人提供建议是否明智。因此,这是一个很好的解释。我的API,因此我对API的理解是根本错误的……我认为。长话短说,我的API返回了一个list of strings。我改为发送列表并在我的应用程序中反序列化。现在一切都正常了。@RandyAugustus很高兴听到这个消息!幸运的是,你有能力更改数据源,因为这才是你真正痛苦的根源。