我在我的項目中使用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
}
}
}
}
問題是我需要收集「名稱」值以及其餘部分,但貨幣代碼是可變的。考慮使用嵌套字典,但似乎無法獲得捕獲「名稱」的方法。
這正是我需要前進的方向,但是您是否有任何想法如何解決更新的問題? – muddymess 2014-10-01 15:16:17
這有點複雜,查看這裏的評論https://gist.github.com/josephjeganathan/20b1e56cb5db4d05ea3f。 我的建議是使用通過查詢解析的「JObject」,即var data = JsonConvert.DeserializeObject(json)作爲JObject'解析和填充的模型。 嵌套字典不是一個很好的選擇。 – 2014-10-01 18:28:19