2014-10-01 52 views
2

我在我的項目中使用Newtonsoft JSON .NET來處理大部分API/JSON用法,並且通常反序列化或轉換爲複雜類型以便於使用。問題是,我似乎無法找出一種處理具有動態名稱/鍵的對象的好方法(即每次都是不同的)。JSON .NET反序列化爲具有對象鍵/名稱的複雜類型

我需要解析的JSON並不完全符合標準,但目前它沒有我的能力來改變它。相關的JSON在下面(我沒有包括整個結構)。

"orders": { 
    "32f5c31d-a851-40cf-a8bb-2fea4bd27777": { 
    "orderId": "ord12345", 
    "state": "new", 
    "sellAmount": "200", 
    "paymentMethod": "buyMethod2", 
    "email": "[email protected]", 
    "pinOrPhonenumber": "180", 
    "timestamp": "2014-10-01T07:13:33.868Z" 
    }, 
    "123d98d5-19b1-4cb3-8ab3-b991650b134c": { 
    "orderId": "ord12346", 
    "state": "pending", 
    "sellAmount": "1200", 
    "paymentMethod": "buyMethod2", 
    "email": "[email protected]", 
    "pinOrPhonenumber": "180", 
    "timestamp": "2014-10-01T07:13:33.868Z" 
    } 
} 

的代碼目前是這樣的:

var jResponse = Newtonsoft.Json.Linq.JObject.Parse(rResponse.Content); 
var jOrders = jResponse["orders"]; 
foreach (var jChild in jOrders) { 
    string sOrderGUID = ""; //The name/key of the object 
    var jOrder = jChild.First.ToObject<Order>(); 
    //Handle the order data, etc 
} 

和類:

public class Order { 

    [JsonProperty("orderId")] 
    public string sOrderID { get; set; } 

    [JsonProperty("state")] 
    public string sState { get; set; } 

    [JsonProperty("sellAmount")] 
    public decimal nAmount { get; set; } 

    [JsonProperty("paymentMethod")] 
    public string sPaymentMethod { get; set; } 

    [JsonProperty("email")] 
    public string sEmail { get; set; } 

    [JsonProperty("phonenumber")] 
    public string sPhonenumber { get; set; } 

    [JsonProperty("paymentMessage")] 
    public string sPaymentMessage { get; set; } 

    [JsonProperty("timestamp")] 
    public DateTime dTimestamp { get; set; } 
} 

一直在尋找到它轉換成JObject和使用屬性拿到鑰匙了,但如果可能的話,我寧願採用更乾淨的方式來做到這一點任何指針?

更新:字典解決方案在訂單情況下效果很好,但是當我嘗試將相同的方法應用於JSON的另一部分時,我遇到了另一個問題。

"rates": { 
    "sek": { 
     "name": "Swedish Krona", 
     "usd": { 
      "name": "US Dollar", 
      "rates": { 
       "2014-10-01T12:14:26.497Z": 0.138794, 
       "2014-10-01T12:17:51.143Z": 0.138794, 
       "2014-10-01T12:26:26.827Z": 0.138794, 
       "2014-10-01T12:51:03.347Z": 0.138794 
      } 
     } 
    }, 
    "usd": { 
     "name": "US Dollar", 
     "sek": { 
      "name": "Swedish Krona", 
      "rates": { 
       "2014-10-01T12:14:28.763Z": 7.20753, 
       "2014-10-01T12:17:52.667Z": 7.20753, 
       "2014-10-01T12:26:28.477Z": 7.20753, 
       "2014-10-01T12:51:04.963Z": 7.20753 
      } 
     } 
    } 
} 

問題是我需要收集「名稱」值以及其餘部分,但貨幣代碼是可變的。考慮使用嵌套字典,但似乎無法獲得捕獲「名稱」的方法。

回答

2

是字典對此是更好的答案。

var orderWrapper = JsonConvert.DeserializeObject<OrderWrapper>(json); 
IEnumerable<Order> orders = result.GetOrders(); 

public class OrderWrapper 
{ 
    [JsonProperty("orders")] 
    private Dictionary<string, Order> _orders; 

    public IEnumerable<Order> GetOrders() 
    { 
     return _orders.Values; 
    } 
} 
+0

這正是我需要前進的方向,但是您是否有任何想法如何解決更新的問題? – muddymess 2014-10-01 15:16:17

+1

這有點複雜,查看這裏的評論https://gist.github.com/josephjeganathan/20b1e56cb5db4d05ea3f。 我的建議是使用通過查詢解析的「JObject」,即var data = JsonConvert.DeserializeObject(json)作爲JObject'解析和填充的模型。 嵌套字典不是一個很好的選擇。 – 2014-10-01 18:28:19

1

我試圖解析您的JSON在下面的線

var result = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Order>>>(jsonString); 

在你的JSON字符串,你必須先一個名爲「訂單」鍵,這將匹配的字符串鍵,如果外字典,然後內字典字符串鍵將與訂單鍵匹配,並且該值將按照訂單解析

相關問題