如何在c#中读取JsonResult对象

3

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

"无法将System.Web.Mvc.Result转换为字符串"

这是我的jsonresult:

[{"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包含两个对象(即香蕉和苹果)。因此,我想遍历数据并获取两个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) { //在这里编写你的代码 } - er-sho
2
isTaxable 是你的 JSON 中的一个布尔值,而 orderid 是整数。 - Access Denied
在你的CreateLineItems方法中,将参数类型从JsonResult改为string - er-sho
你的 JSON 是一个对象列表,所以你需要将其反序列化为 List<ResultDto>,而 isTaxable 是布尔类型,orderId 是整数类型。 - er-sho
4个回答

6

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

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

根据Tashi的回答,应该使用JsonResult将数据返回给视图。那么,如果是这样的话,我应该使用什么参数来从视图获取数据呢? - mcfred

1
我不知道您如何在控制器中接受JsonResult,但请停止这样做。JsonResult用于向客户端返回数据,而不是接受来自客户端的数据。您的控制器应该接受一个ResultDto[],这个数组应该由MVC框架自动反序列化JSON。然后,您可以继续处理它。
此外,正如其他人在评论中指出的那样,isTaxable是bool类型,orderId是int类型,请正确地为ResultDto属性指定类型。

这是一个很好的建议。我将根据你的建议修改我的代码,并且如果成功的话会告诉你。 - mcfred
它没有起作用。实际上,我收到的是这样的内容:ResltDto[0]。就像一个字符串一样。我通过ajax传递我的lineitems,像这样:data: JSON.stringify(lineitems)。 - mcfred
从你的代码示例中看,@bangbang,你在.ajax()函数的data属性中发送了一个对象。你应该只发送JSON.stringify(lineitems)的结果。 - Tsahi Asher

0

嗯,这是因为根据文档说明,JSONResult已经格式化了:jsonResult。你需要进入jsonResult的data.Data对象。

试着替换这个:

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

使用这个:
ResultDto dto = JsonConvert.DeserializeObject<ResultDto>(data.Data);

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


0
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)
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接