使用Json.net将Json转换为C#对象

使用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

我搜索了很多网站,并在我的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\":\"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很高兴听到这个消息!幸运的是,你有能力更改数据源,因为这才是你真正痛苦的根源。