反序列化与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>
}
现在我必须解决重复项目的
答
首先,你需要创建一个类返回的对象工作(假设你知道你做的什么时间提前)。
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;
}
}
答
如果不指定反序列化一个类型,你会得到一个jObject。它的属性是在运行时推导出来的。
dynamic result = JsonConvert.DeserializeObject(json);
现在,还有另一种获得jObject的方法。
var result = jObject.Parse(json);
var sessionKey = p.GetValue("SessionKey").Value<string>();
Read this。如果你不知道前面的类型(如你的情况),是否使用反序列化或解析并没有真正的区别。无论哪种方式,你会得到一个jObject。
你能进一步澄清你的问题。 “你应该怎么读这个东西?”是什么意思?你正在表明你正在对它进行反序列化,你究竟在干什么? JSON.Net有一个通用的反序列化选项,为您的预期数据创建一个类并反序列化这些对象的数组。 – pstrjds
我的意思是我该如何处理这个对象?它是一个数组吗? – cgame92
我稍微改写的问题和固定破碎JSON(有一些报价丢失)。如果我没有正确地重申这个问题,请随时编辑。 – pstrjds