JSON .NET反序列化为具有对象键/名称的复杂类型
问题描述:
我在我的项目中使用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
}
}
}
}
问题是我需要收集“名称”值以及其余部分,但货币代码是可变的。考虑使用嵌套字典,但似乎无法获得捕获“名称”的方法。
答
是字典对此是更好的答案。
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;
}
}
答
我试图解析您的JSON在下面的线
var result = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string,Order>>>(jsonString);
在你的JSON字符串,你必须先一个名为“订单”键,这将匹配的字符串键,如果外字典,然后内字典字符串键将与订单键匹配,并且该值将按照订单解析
这正是我需要前进的方向,但是您是否有任何想法如何解决更新的问题? – 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