先贴出要解析的数据格式:
{
"C0:00:56:6E:01:36":{
"model":"iw-02",
"rssi":-82,
"routerMac":"CC:1B:E0:E8:33:14",
"node":"C0:00:5B:6E:01:36",
"step":880,
"calorie":27.5,
"heartrate":0,
"battery":53,
"sportType":1,
"timestamp":1534388343158,
"position":"CC:1B:E0:E8:33:14"
},
"C0:00:5B:33:71:B8":{
"model":"iw-02",
"rssi":-82,
"routerMac":"CC:11:E0:E1:33:14",
"node":"C0:00:5B:3F:71:B8",
"step":267,
"calorie":8.6,
"heartrate":0,
"battery":96,
"sportType":1,
"timestamp":1534388327140,
"position":"CC:11:E0:E1:33:14"
},
"type":"breceletData"
}
先介绍下场景,我在写一个API Post接口,数据是第三方给我发过来的,
数据格式不爽也没办法,第三方的么。
上面的例子数据是一次发过来的一条json,没有key,
里面的一个Mac地址对应的一个对象就是一个设备的数据,数量不固定,可能是0也可能是几十几百个。
上面的数据可以看出来几个跟我们正常不太一样的地方:
1、key的值不固定,因为每个设备的Mac地址不一样;
2、每条数据最后都有个异类"type" : "xxxx";
试了很多方式去解析,直接贴出最后解决办法:
var model = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonStr);
// 3、遍历字典 并将各个条目保存到数据库
foreach (var item in model)
{
if (!(item.Value is string))
{
// 假装取出每个设备的Model字段
var itemModel = item.Value.model;
}
}
注:解析的方式不固定,你可以使用别的解析方式,主要是目标类型的设置,
解析的时候直接使用字典来接收,但是考虑到最后那个type异类
所以字典的value的类型设置为dynamic类型,
dynamic作用类似object,但是被设置的位置可以逃过静态检查。
注:在foreach遍历中,还是要考虑type这个异类,使用value值的类型不是string即可解决。
然后我假装取了一个字段。