我正试图从一个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>
}
现在我必须修复重复的项目
答案 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;
}
}