【问题标题】:Deserialising a list<struct>反序列化列表<struct>
【发布时间】:2015-04-24 14:47:39
【问题描述】:

我正在尝试从 json 反序列化为 List&lt;struct&gt; - 但是我的对象始终为空。源 JSON 中的数据类型似乎是正确的,而且我的代码没有抛出任何错误,所以我完全不知道为什么它不起作用。

我要转入的班级:

public class SystemStatusRules
{
    public struct EmailItem 
    {
        public int EmailSubject_Id;
        public bool IsSubject;
        public string Email_String; 
        public int StatusCode;
    }
    public List<EmailItem> EmailItems {get; set;}
}

我的 JSON:

{"EmailItems":[
    {"EmailSubject_Id":16,"IsSubject":true,"Email_String":"Cube Build Successful","StatusCode":0},
    {"EmailSubject_Id":17,"IsSubject":true,"Email_String":"Cube Build Failure","StatusCode":0}
]}

最后,我的反序列化代码:

[HttpPost]
public bool SetAllStatusRules(string ruleList )
{
    SystemStatusRules subjectRules =
        JsonConvert.DeserializeObject<SystemStatusRules>(ruleList);
}

以防万一,我的序列化代码:

objArray.push({ EmailSubject_Id: SubjectId, IsSubject: IsSubject,
                Email_String: EmailSubject, StatusCode: status });
objArray = { EmailItems: objArray };
var rulesJSON = JSON.stringify(objArray);
$.ajax({
    url: "Management/SetAllStatusRules",
        type: 'POST',
        data: 'ruleList='+rulesJSON,
        success: function (result) {
            MyResultFunction(result);
      }
  });

编辑:

这与我铸造一个对象有关。以下代码具有正确填充的 subjectRules 变量。但是 ssr 为空。

object subjectRules = JsonConvert.DeserializeObject<SystemStatusRules>(StatusRules);
SystemStatusRules ssr = (SystemStatusRules)subjectRules;

我不知道出了什么问题,但是反序列化为 var 允许我使用带有数据的对象作为解决方法。

【问题讨论】:

  • EmailItems 变量是字段。为每个人添加{get;set;}
  • @EBrown:这在这里应该没什么区别...它们是 public 字段,因此应该正确填充它们...
  • 如果我将它们更改为属性,仍然返回 null。
  • 这个works fine for me。这是你所有的代码吗?
  • 这是唯一被执行的代码。除非我的配置中有可能影响它的东西。我正在使用 Newtonsoft.Json 版本=4.5.6。因为这是唯一与我正在使用的 MVC 版本兼容的版本。

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


【解决方案1】:

回答

这里是a working fiddle for you编辑:您不需要[FromBody]。它只是工作。您的代码显然没有任何问题。

查看

<html lang="en">
    <head></head>
    <body>
        <div class="container"></div>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
        <script type="text/javascript">

$(function(){

    var container = $(".container");
    var objArray = [];

    objArray.push({ 
        EmailSubject_Id: "0", 
        IsSubject: "false",
        Email_String: "My Email", 
        StatusCode: "0" });

    objArray = { EmailItems: objArray };    

    var rulesJSON = JSON.stringify(objArray);
    $.ajax({
        url: '@Url.RouteUrl(new{ action="SetAllStatusRules", controller="Home"})',
        type: 'POST',
        data: 'ruleList='+rulesJSON                     
        })
    .done(function (d) { container.html(d); } );

});

        </script>
    </body>
</html>

控制器

using System.Web.Mvc;
using Newtonsoft.Json;

namespace HelloWorldMvcApp
{
    public class HomeController : Controller
    {
        [System.Web.Mvc.HttpGetAttribute]
        public ActionResult Index()
        {
            return View();
        }

        [System.Web.Mvc.HttpPost]
        public string SetAllStatusRules(string ruleList)
        {
            SystemStatusRules subjectRules = 
                JsonConvert.DeserializeObject<SystemStatusRules>(ruleList);
            return subjectRules.EmailItems[0].Email_String;
        }
    }
}

型号

using System.Collections.Generic;

namespace HelloWorldMvcApp
{
    public class SystemStatusRules
    {
        public struct EmailItem
        {
            public int EmailSubject_Id;
            public bool IsSubject;
            public string Email_String;
            public int StatusCode;
        }

        public List<EmailItem> EmailItems { get; set; }
    }
}

控制台应用程序(最初测试)

这似乎与您的 JavaScript POST 以及它提供给您的服务器的有效负载有关。那是因为以下工作 (see fiddle):

public class Program
{
    public static void Main()
    {
        var json = @"
{'EmailItems':[
    {'EmailSubject_Id':16,'IsSubject':true,'Email_String':'Cube Build Successful','StatusCode':0},
    {'EmailSubject_Id':17,'IsSubject':true,'Email_String':'Cube Build Failure','StatusCode':0}
]}";
        var p = new Program();
        p.SetAllStatusRules(json);
    }

    public bool SetAllStatusRules(string ruleList)
    {
        SystemStatusRules subjectRules = JsonConvert.DeserializeObject<SystemStatusRules>(ruleList);
        Console.WriteLine(subjectRules.EmailItems.Count.ToString());
        Console.WriteLine(subjectRules.EmailItems[0].Email_String);
        return true;
    }
}

public class SystemStatusRules
{
    public struct EmailItem
    {
        public int EmailSubject_Id;
        public bool IsSubject;
        public string Email_String;
        public int StatusCode;
    }
    public List<EmailItem> EmailItems { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2011-08-01
    • 2016-04-14
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多