【问题标题】:Unable to Serialize/Deserialize List<> object into JSON无法将 List<> 对象序列化/反序列化为 JSON
【发布时间】:2016-10-08 17:27:38
【问题描述】:

我正在开发 2 个网络应用程序; A & B. 现在我在两个 Web 应用程序上都有一个名为 CRUDOutput 的共享类:-

public class CRUDOutput
{
    public Operation4 operation { get; set; }
}
public class Operation4
{
    public Result result { get; set; }
    public string name { get; set; }
}
public class Result
{
    public string status { get; set; }
    public string message { get; set; }

}

现在在 Web 应用程序 A 中,我返回以下内容:-

[HttpPost]
public ActionResult CreateResource(CreateResource cr)
{
    List<CRUDOutput> co = new List<CRUDOutput>();
            co.Add(JsonConvert.DeserializeObject<CRUDOutput>(crudoutput));
            co.Add(JsonConvert.DeserializeObject<CRUDOutput>(crudoutput2));

    return Json(JsonConvert.SerializeObject(co));
}

现在从 web 应用程序 B,我调用 action 方法如下:-

try
{
    using (WebClient wc = new WebClient()) 
    {
        string url = "https://localhost:44302/" + "Home/CreateResource";
        Uri uri = new Uri(url);
        wc.Headers.Add(HttpRequestHeader.ContentType, "application/json");

        output = wc.UploadString(uri,  data);
    }
}
catch (WebException e)
{
}
List<CRUDOutput> result = JsonConvert.DeserializeObject<List< CRUDOutput>>(output);

但是当我尝试反序列化输出时会出现以下异常:-

错误转换值 "[{"operation":{"result":{"status":"Success","message":"资源有 已成功添加到......"},"name":"CREATE RESOURCE"}},{"operation":{"result":{"status":"Failed","message":"Account 添加 "},"name":"ADD ACCOUNTS"}}]" 输入 'System.Collections.Generic.List`1[S.ViewModels.CRUDOutput]'。小路 '', 第 1 行,位置 464。

现在从 Web 应用程序 A 返回的 JSON 如下:-

"\"[{\\\"operation\\\":{\\\"result\\\":{\\\"status\\\":\\\"Success\\\",\\\"message\\\":\\\"Resource 123 rfrf has been added successfully \\\"},\\\"name\\\":\\\"CREATE RESOURCE\\\"}},{\\\"operation\\\":{\\\"result\\\":{\\\"status\\\":\\\"Failed\\\",\\\"message\\\":\\\"Account addition \\\"},\\\"name\\\":\\\"ADD ACCOUNTS\\\"}}]\""

那么谁能告诉我为什么我无法反序列化为对象列表?

【问题讨论】:

  • 控制器方法中的result是什么?
  • @AmitKumarGhosh 对不起,我错过了输入,,

标签: c# asp.net json asp.net-mvc json.net


【解决方案1】:

您粘贴的输出被编码为 JSON 两次。比较两者的区别:

"\"[{\\\"operation\\\":{\\\"result\\\":{\\\"status\\\":\\\"Success\\\",\\\"message\\\":\\\"Resource 123 rfrf has been added successfully \\\"},\\\"name\\\":\\\"CREATE RESOURCE\\\"}},{\\\"operation\\\":{\\\"result\\\":{\\\"status\\\":\\\"Failed\\\",\\\"message\\\":\\\"Account addition \\\"},\\\"name\\\":\\\"ADD ACCOUNTS\\\"}}]\""

"[{\"operation\":{\"result\":{\"status\":\"Success\",\"message\":\"Resource 123 rfrf has been added successfully \"},\"name\":\"CREATE RESOURCE\"}},{\"operation\":{\"result\":{\"status\":\"Failed\",\"message\":\"Account addition \"},\"name\":\"ADD ACCOUNTS\"}}]"

发生这种情况是因为您将结果编码为 Json 两次。替换:

return Json(JsonConvert.SerializeObject(result));

return Json(result);    // This encodes as JSON automatically

【讨论】:

  • 所以你的意思是 MVC 会为我做序列化?
  • 是的,它会的。 Json 方法接受一个对象,而不是一个字符串。
  • 那么使用 JSON.net 会有什么好处吗?似乎 mvc 会开箱即用地完成这项工作?还是 JSON.net 会做 MVC 开箱即用不能做的事情?
  • MVC 在幕后使用 json.net。
  • @johng 如果您想使用JavaScriptSerializer,那么只需使用Json(result),正如理查德在上面的回答中向您展示的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多