【发布时间】:2018-04-28 02:16:34
【问题描述】:
我从第三方 Web 服务获得了这个“优化”的 JSON 响应,如下所示,我根据键中提供的信息构建了类型,但我面临的困难是数据不是在对象中表示,而是在数组,有没有办法自动化我的对象列表的构建和值映射?
{
"reports": {
"query": {
"keys": [{
"name": "Date",
"type": "date"
}, {
"name": "NetSales",
"type": "price"
}, {
"name": "GrossCash",
"type": "price"
}, {
"name": "GrossCard",
"type": "price"
}, {
"name": "GrossDelivery",
"type": "price"
}, {
"name": "NetFood",
"type": "price"
}, {
"name": "NetDrink",
"type": "price"
}, {
"name": "NetRetail",
"type": "price"
}, {
"name": "Baskets",
"type": "int"
}],
"data": [
[1523577600000, 51924, 11300, 27200, 9900, null, null, null, 8],
[1523404800000, 7434, 2600, 3900, null, null, null, null, 6],
[1523491200000, 18101, 4000, 10100, null, null, null, null, 5],
[1523664000000, 13243, 7400, 6500, null, null, null, null, 3],
[1523750400000, 11718, 7300, null, 5000, null, null, null, 2],
[1523836800000, 16576, 7700, 4800, 4900, null, null, null, 4],
[1524096000000, 20293, 9100, 6000, null, null, null, null, 4]
]
}
},
"api": {
"message": {
"success": {
"202": {
"id": 202,
"title": "Token is valid",
"details": "Token is validated and found valid."
}
}
},
"codeBaseVersion": 1,
"executionTime_milliSeconds": 43
}
}
我最终得到了这段代码,但对它不满意:
JObject myOpject = JObject.Parse(responseString);
List<JToken> setOfObjects = myOpject["reports"]["query"]["data"].Children().ToList();
var listOfData = new List<Data2>();
foreach (var token in setOfObjects)
{
var myObject = new Data2
{
NetSales = decimal.Parse(token[1].ToString()),
//etc.
};
listOfData.Add(myObject);
}
【问题讨论】:
-
键的动态性如何?这里有两个营地。创建一个可以解释数据的自定义 DynamicObject 或创建一个与键匹配的强类型模型,然后使用反射将属性与键匹配并构建对象。
-
@Nkosi 它们是稳定的,但正如您所说,我需要映射到强类型模型并映射到它。您能否提供一个示例代码来说明您所说的内容?
-
这是一个想法,使用相同的 JToken 思想,使用键转换数据以创建对象模型,然后将其反序列化为所需的强类型。
标签: c# arrays json web-services json.net