【问题标题】:JSON not being deserialized correctly on the serverJSON 未在服务器上正确反序列化
【发布时间】:2013-10-07 23:14:28
【问题描述】:

我在客户端有一个 javascript 对象,它具有 SettingName 和 SettingValue 属性。

数据示例 -

obj1.SettingName = "createdDate";
obj1.SettingValue = "10/07/2013";

obj2.SettingName = "arrayOfNames";
obj1.SettingValue = SomeArray; //An array of 5 strings

var settingsArray =new Array();
settingsArray[0] = obj1;
settingsArray[1] = obj2;

var settingsContainer = new Object;
settingsContainer.Settings = settingsArray;

ajax 调用 -

    $.ajax({
        type: "POST",
        url: "myURL",
        data: { settings: JSON.stringify(settingsContainer)},
        dataType: 'json',
        success: function (data) {
            //do something
        }
    });

服务器端类-

public class Setting
{        
    public string SettingName { get; set; }
    public object SettingValue { get; set; } //so this can hold multiple data types
}

public class SettingsContainer 
{
    public List<Setting> Settings { get; set;}
}

控制器动作 -

public ActionResult myURL(SettingsContainer settings) {
    //Here, the value for SettingsContainer.Settings[1].SettingValue, which 
      should be Array[5] i.e. on the C# side, I expect to see Object[5], 
      is only {object}. I'm not sure what's going on.

      Is my approach of handling this correct?
}

任何建议/帮助将不胜感激。谢谢!

【问题讨论】:

  • 您的 Javascript 似乎没有在任何地方初始化变量 settings
  • 出现复制粘贴错误:obj1.SettingValue = Array[5];你的测试中使用过这个吗?
  • @MikeW,抱歉,打错了
  • @TravisJ,更正了这一点。我正在尝试做的事情非常复杂,所以我尝试在这里发布我的代码的 sn-p。因此错别字。我道歉。
  • 不确定为什么当您将属性设置为 object 时希望看到 object[5]。尝试将其更改为 object[]。

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


【解决方案1】:

在服务器端方法上,您应该使用:

   public ActionResult myURL(string settings) {
       // deserialize the string to your object here;
    }

但是你必须重新设计你的类,因为它们不支持 javascript反序列化。

【讨论】:

    【解决方案2】:

    尝试使用“SettingValue”作为List&lt;string&gt; 或您所期望的。你不能反序列化为对象,因为反序列化器不知道对象是什么。

    【讨论】:

      【解决方案3】:

      尝试将ajax调用中的数据行设置成这样

      data: "{ 'settings':" +  JSON.stringify(settingsContainer)+"}",
      

      (也许您可以避免使用 SettingsContainer,而只使用向量或设置列表作为方法参数)。

      以下代码应该可以帮助您解决问题。

      代码隐藏:

      public class helper
      {
          public List<DoubleText> prop { get; set; }
      }
      public class DoubleText
      {
          public string data1 { get; set; }
          public object data2 { get; set; }
      }
      [WebMethod]
      public static string work(helper example)
      {
      // do stuff here
          return "ok";
      }
      

      javascript/jquery

      var example = new Object();
              example.data1 = 'value';
              example.data2 = ['value1', 'value2'];
      
              var example2 = new Object();
              example2.data1 = 'value';
              example2.data2 = ['value1', 'value2'];
      
              var vector = new Array();
              vector[0] = example;
              vector[1] = example2;
      
              var ex = new Object();
              ex.prop = vector;
      
      
                  var test = "{ 'example':" + JSON.stringify(ex) + "}";
                  $.ajax({
                      type: "POST",
                      url: '/work.aspx/work',
                      data: test,
                      contentType: "application/json; charset=utf-8",
                      dataType: "json",
                      success: function (data) {
                          // stuff
                      },
                      error: function () { // other stuff}
      
                  });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 2019-05-02
        • 2022-01-02
        • 2021-02-13
        • 2021-06-08
        相关资源
        最近更新 更多