【问题标题】:How to read JsonResult object in c#如何在 C# 中读取 JsonResult 对象
【发布时间】:2018-09-20 09:33:33
【问题描述】:

我正在尝试反序列化我的 jsonresult,但我收到以下错误消息:

“无法从 System.Web.Mvc.Result 转换为字符串”

这是我的json结果:

[{"description":"BANANA","quantity":"12","productPrice":"40000","discount":"","isTaxable":true,"finalPrice":"9999","lineItemTotal":"999","orderId":8},{"description":"APPLES","quantity":"20","productPrice":"860000","discount":"","isTaxable":false,"finalPrice":"12000","lineItemTotal":"10000","orderId":8}]

这是我的控制器方法:

 [System.Web.Mvc.HttpPost]
        public JsonResult CreateLineItems(JsonResult data)
        {


           ResultDto dto = JsonConvert.DeserializeObject<ResultDto>(data);
            //for (int i = 0; i < data.Data; i++)
            //{
            //    
            //}

            return data;
        }

这是我的 ResultDto 类:

public class ResultDto
    {

        public string description { get; set; }
        public string quantity { get; set; }
        public string productPrice { get; set; }
        public string discount { get; set; }
        public bool isTaxable { get; set; }
        public string finalPrice { get; set; }
        public string lineItemTotal { get; set; }
        public int orderId { get; set; }
    }

JsonResut 包含两个对象(即香蕉和苹果)。所以,我想遍历 Data 并获得两个 ResultDtos 。我如何实现这一目标?

这行给了我错误:`ResultDto dto = JsonConvert.DeserializeObject(data);

我正在从视图中发送这样的数据:

$.ajax({
                    url: url,
                    data: {
                        data: JSON.stringify(lineitems)
                    },
                    cache: false,
                    type: "POST",
                    success: function (data) {

                    },
                    error: function (reponse) {
                        alert("error : " + reponse);
                    }
                });

在我的控制器中获取这些数据(对象数组)的最佳方式是什么?一旦我在我的控制器中获得这些数据,我想将它保存在数据库中。所以,我不确定 JsonResult 是否是我的方法的正确返回类型。

【问题讨论】:

  • 试试这个public JsonResult CreateLineItems(string data) { //your code here }
  • isTaxable 在你的 json 中是 bool,orderid 是 int。
  • 使用string 作为CreateLineItems 方法的参数类型,而不是JsonResult
  • 你的json也是一个对象列表,所以你必须反序列化为List&lt;ResultDto&gt;isTaxableboolorderIdint

标签: c# jsonresult


【解决方案1】:

你已经有一个 JSON。现在解决您的问题的方法是将您的 JSONObject 字符串化,然后将其反序列化为您想要的类型。

string json = JsonConvert.SerializeObject(jsonResult.Data);
ResultDto dto = JsonConvert.DeserializeObject<ResultDto>(json);

【讨论】:

  • 请查看我编辑的问题。根据 Tashi 的回答,应该使用 JsonResult 返回数据以供查看。那么,如果是这种情况,那么我应该使用什么参数从视图中获取数据?
【解决方案2】:

我不知道您是如何在控制器中接受JsonResult 的,但请停止这样做。 JsonResult 用于向客户端返回数据,而不是接受来自客户端的数据。你的控制器应该接受一个ResultDto[],它应该由 MVC 框架从你的 JSON 中自动反序列化。然后,您可以继续工作。

此外,正如 cmets 中的其他人所指出的,isTaxableboolorderIdint,因此请正确输入您的 ResultDto 属性。

【讨论】:

  • 这是一个很好的建议。我将根据您的建议调整我的代码,如果我成功了会通知您。
  • 它没有用。我实际上收到了这样的信息:ResltDto[0]。而已。它就像一根绳子。我将这样的 lineitems 传递给 ajax: data: JSON.stringify(lineitems)
  • @bangbang 从您的代码示例中看起来您正在为.ajax() 函数发送data 属性中的对象。您应该只发送JSON.stringify(lineitems) 的结果。
【解决方案3】:

这是因为 JSONResult 根据文档:jsonResult 已经格式化。您需要进入 jsonResult 的 data.Data 对象。

尝试替换这个:

ResultDto dto = JsonConvert.DeserializeObject<ResultDto>(data);

用这个:

ResultDto dto = JsonConvert.DeserializeObject<ResultDto>(data.Data);

如果这不起作用,请尝试 Sakuto 的解决方案。

【讨论】:

    【解决方案4】:

    先把isTaxable改成bool

    public class ResultDto
    {
        public string description { get; set; }
        public string quantity { get; set; }
        public string productPrice { get; set; }
        public string discount { get; set; }
        public bool isTaxable { get; set; }
        public string finalPrice { get; set; }
        public string lineItemTotal { get; set; }
        public int orderId { get; set; }
    }
    

    然后,尝试反序列化

    var dtos = JsonConvert.DeserializeObject<IEnumerable<ResultDto>>(json);
    foreach(var dto in dtos)
    {
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多