反序列化与JSON对象

问题描述:

我'尝试从Deserilized JSON对象来工作。 目前我使用下面的代码反序列化JSON数据:我的JSON对象的反序列化与JSON对象

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

内容:

{{ 
    "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> 
    } 

现在我必须解决重复项目的

+0

你能进一步澄清你的问题。 “你应该怎么读这个东西?”是什么意思?你正在表明你正在对它进行反序列化,你究竟在干什么? JSON.Net有一个通用的反序列化选项,为您的预期数据创建一个类并反序列化这些对象的数组。 – pstrjds

+0

我的意思是我该如何处理这个对象?它是一个数组吗? – cgame92

+0

我稍微改写的问题和固定破碎JSON(有一些报价丢失)。如果我没有正确地重申这个问题,请随时编辑。 – pstrjds

首先,你需要创建一个类返回的对象工作(假设你知道你做的什么时间提前)。

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; 
    } 
} 
+0

非常感谢。这似乎是对我来说最好的解决方案!但是,我怎么总结存在两次或更多的项目呢? – cgame92

+0

@ cgame92 - 我添加了一个显示实现分组的方法。一般来说,你发布一个新问题,而不是添加评论或修改原始问题以提出新问题。 – pstrjds

如果不指定反序列化一个类型,你会得到一个jObject。它的属性是在运行时推导出来的。

dynamic result = JsonConvert.DeserializeObject(json); 

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

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

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