Removing deserialization of the <struct> list

I am trying to deserialize from json to List<struct>, but my object is always null. The data types in the original JSON seem correct, and my code does not cause any errors, so I am completely fixated on why it does not work.

The class I'm deserting into:

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;}
}

My 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}
]}

and finally my deserialization code:

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

Just in case, if you need it, my code for serialization:

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

Edit:

This is something to do with me, throwing at the object. The following code has a subjectRules variable that is correctly populated. However, ssr is null.

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

I don’t know what’s wrong, but deserializing in var allows me to use the data object as a workaround.

+4
1

. : [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>

Controller

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;
        }
    }
}

Model

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 , . , (. ):

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; }
}
+3

Source: https://habr.com/ru/post/1584514/


All Articles