反序列化和使用JSON对象

时间:2016-12-31 12:31:35

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

我正试图从一个Deserilized Json对象中读取。 目前我使用以下代码反序列化JSON数据:

var jsondecode = Newtonsoft.Json.JsonConvert.DeserializeObject(Request.Cookies.Get("wrkb").Value);

我的JSON对象的内容:

{{
  "shoppingbasket": [
    {
      "price": 12,
      "product": "Lachum",
      "quantity": 2,
      "total": 24
    },
    {
      "price": 2,
      "product": "Laici",
      "quantity": 3,
      "total": 12
    },
    {
      "price": 12,
      "product": "Lachum",
      "quantity": 1,
      "total": 12
    }
  ]
}}

我想将此JSON字符串转换为我可以使用的.Net对象集合。

例如,我希望能够在反序列化对象后生成这种类型的输出。

Shoppingbasket:
1) Product = Lachum, Price = 12, Quantity = 3, Total = 36
2) Product = Laici, Price = 2, Quantity = 3, Total = 6

Total-Price of basket = 42

这是我的解决方案,但pstrjds的优雅解决方案:

 DataSet dataSet = Newtonsoft.Json.JsonConvert.DeserializeObject<DataSet>(Request.Cookies.Get("wrkb").Value);
    DataTable dataTable = dataSet.Tables["shoppingbasket"];

    string print = "";
    double basket_total = 0.0;
    foreach (DataRow row in dataTable.Rows)
    {
        print = "Product= " + row["product"] + " Price= " + row["price"] + " Quantity= " + row["quantity"] + " Total= " + row["total"];
        basket_total += Convert.ToInt32(row["total"]);
        <div class="row">
            <ul class="col-md-12">
                <li><div class="col-md-12">@print</div></li>
            </ul>
        </div>
    }

现在我必须修复重复的项目

2 个答案:

答案 0 :(得分:1)

如果您没有为反序列化指定类型,那么您将获得一个jObject。它的属性是在运行时推断出来的。

dynamic result = JsonConvert.DeserializeObject(json);

现在,还有另一种获取jObject的方法。

var result = jObject.Parse(json);
var sessionKey = p.GetValue("SessionKey").Value<string>();

Read this。如果您不知道前面的类型(如您的情况),是否使用反序列化或解析没有真正的区别。无论哪种方式,你都会得到一个jObject。

答案 1 :(得分:1)

首先,你需要创建一个类来处理返回的对象(假设你知道你提前得到了什么)。

public class ShoppingbasketItem
{
    public double price { get; set; }
    public string product { get; set; }
    public int quantity { get; set; }
    public int total { get; set; }
}
public class Shoppingbasket
{
    public List<ShoppingbasketItem> shoppingbasket { get; set; }
}

然后你可以将对象反序列化为你的C#代码,然后从那里做你需要做的任何事情。

var products = Newtonsoft.Json.JsonConvert.DeserializeObject<Shoppingbasket>(Request.Cookies.Get("wrkb").Value);

因此,要计算总数的总和,您可以从篮子中迭代列表。

double totalSum = 0.0;
foreach(var item in products.shoppingbasket)
{
    totalSum += item.quantity * item.price;
}

修改
要实现您正在寻找的分组,您可以执行类似的操作。这可能不是最好的解决方案,但是我想到的就是我的头脑。

var grouped = new Dictionary<string, ShoppingbasketItem>();

foreach (var item in products.shoppingbasket)
{
    ShoppingbasketItem temp = null;
    if (grouped.TryGetValue(item.product, out temp))
    {
        temp.quantity += item.quantity;
        temp.total += item.total;
    }
    else
    {
        grouped[item.product] = item;
    }
}