2016-12-31 140 views
0

我'嘗試從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

回答

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

非常感謝。這似乎是對我來說最好的解決方案!但是,我怎麼總結存在兩次或更多的項目呢? – cgame92

+0

@ cgame92 - 我添加了一個顯示實現分組的方法。一般來說,你發佈一個新問題,而不是添加評論或修改原始問題以提出新問題。 – pstrjds

1

如果不指定反序列化一個類型,你會得到一個jObject。它的屬性是在運行時推導出來的。

dynamic result = JsonConvert.DeserializeObject(json); 

現在,還有另一種獲得jObject的方法。

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

Read this。如果你不知道前面的類型(如你的情況),是否使用反序列化或解析並沒有真正的區別。無論哪種方式,你會得到一個jObject。