【问题标题】:Deserialize JSON hashset in controller ASP.NET to hashset or dictionary将控制器 ASP.NET 中的 JSON 哈希集反序列化为哈希集或字典
【发布时间】:2020-03-14 16:47:35
【问题描述】:

我在按钮上有一个功能(有效)我​​用键/值对形成 JSON 对象 priceWorkData 的 HashSet。我的意思是许多简单的键/值对,例如 {1,11;2,12,55,67;44,77}。我将它作为 JSON 对象传递给控制器​​,但我无法正确反序列化此 HashSet。我想在控制器中获取对的列表或字典。

function CalculateWorkHand(act) {

            var mySet = new Set();

        $(".PriceWork").each(function ()
        {
            var ValuePrice = this.value;
            var Id = this.id
            var o = {id: this.id, ValuePrice: this.value};
            mySet.add(o);

        });
        var pricejson = {mySet: mySet };

    $.ajax({  
       url: '@Url.Action("CalculateWorkHandJSON", "Acts")',       
        type: 'post',
        dataType: "json",
        data: { "pricejson": JSON.stringify(pricejson),"id":act},
        success: function (data) {
                if (data.success) {
                  alert("Success");
                 }
                else {
                 alert("Data Error");
                }
        },
        error: function(xhr, status) {
              //var err = eval("(" + xhr.responseText + ")");
             alert("Error AJAX");
         }
      });
  };

       public class SelectedJournal
        {
            // [JsonProperty("id")]
            public string Id { get; set; }
            //  [JsonProperty("value")]
            public string ValuePrice { get; set; }
        }


       public ActionResult CalculateWorkHandJSON(int id, string pricejson)
        {
            Act act = db.Act.Find(id);    
            var serializer = new JavaScriptSerializer();         
            List<SelectedJournal> deserializedResult = serializer.Deserialize<List<SelectedJournal>>(pricejson);           
            var temp = JsonConvert.DeserializeObject<List<SelectedJournal>>(pricejson);

       ..........
        return ...;

        }

我收到错误“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[projectofstack.Controllers.ActsController+SelectedJournal]',因为类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 路径 'priceWorkData',第 1 行,位置 17。'

【问题讨论】:

  • 你能告诉我你的pricejson字符串吗?我刚刚上线,所以我可以帮助您反序列化您的字符串。你也可以试试这个:var temp = JsonConvert.DeserializeObject&lt;dynamic&gt;(pricejson);。正确解析后,您可以访问解析后的 temp 字符串中的变量
  • 您是否尝试过调试您的代码并检查您是否能够点击CalculateWorkHandJSON 方法?您可以导航到您的pricejson 并查看您在那里收到的值。
  • 从外观上看,您的function CalculateWorkHand(act) 没有收到itemIDitemPrice 的值。您需要在函数中获取值。在这两行中:var ValuePrice = //get value here;var Id = //Get value here。你可以参考这个问题:stackoverflow.com/questions/10668623/…
  • 我需要问你两件事:1) 当你做console.log(priceWorkData) 时,你是否能够在你的priceWorkData 中获得你的价值观。 2)如果您在priceWorkData 字符串中获取值,那么您是否可以使用您的CalculateWorkHandJSON 方法?如果您正在使用此方法,那么您在那里看到了什么价值?
  • 好的,你需要做的是你写alert的地方,在那个类型下面:console.log(priceWorkData)。然后刷新您的页面并点击F12 打开您的网络浏览器的开发者控制台。在Console 类别下,您将看到打印的priceWorkData 字符串。让我知道你在那里看到了什么

标签: c# jquery asp.net json


【解决方案1】:

关于您的情况,由于您正在生成 Set,因此您需要将其正确发送到您的 Controller 方法。您需要进行以下更改:

在您的 AJAX 调用中,将此行 data: { "pricejson": JSON.stringify(pricejson),"id":act} 更改为 data: { "pricejson": JSON.stringify([...mySet]),"id":act}

基本上,您需要发送您的集合的string 表示,然后将其发送到您的Controller。在控制器方法中收到值后,您可以对其进行反序列化:var deserializedResult = serializer.Deserialize&lt;List&lt;SelectedJournal&gt;&gt;(pricejson);

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2013-12-29
    • 2015-02-12
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多