2015-04-24 3 views
4

Я пытаюсь десериализовать из json в List<struct> - однако мой объект всегда имеет значение null. Типы данных в исходном JSON кажутся правильными, и мой код не вызывает никаких ошибок, поэтому я полностью зациклен на том, почему он не работает.Deserializing a list <struct>

Класс Я deserilaising в:

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

Edit:

Это что-то делать со мной кастинг в объект. Следующий код имеет переменную subjectRules, которая правильно заполнена. Однако ssr равно null.

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

Я не имею ни малейшего представления, что это неправильно, но deserialising в Var позволяет мне использовать объект с данными, как обходной путь.

+0

Переменные 'EmailItems' - это поля. Добавьте '{get; set;}' к каждому из них. –

+0

@EBrown: Это не должно иметь значения здесь ... Они - поля _public_, поэтому они должны быть заполнены правильно ... –

+0

Все еще возвращает null, если я изменю их на свойства. –

ответ

3

Ответ

Вот 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; } 
    } 
} 

Console App (для тестирования на начальном этапе)

Это, кажется, что-то делать с JavaScript POST и па yload, который он доставляет на ваш сервер. Это связано с тем, что следующие работы (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; } 
} 
Смежные вопросы