需求:对于传统的Json字符串,比如有规定属性的对象,通常都会采用反序列化的方式就可以了;同样,如果出现不同属性,但具有相同的数据结构是,采用同一个接口传输时,就导致JSON数据属性动态变化,出现动态JSON.
例如处理固定属性结构的json:(devicename、propertydate、id、status、types 属性不变化,数值发生变化)
json字符串:
{
"devicename": "WO170330000375",
"propertydate": {
"id": "WO170330000376",
"status": "执行中",
"types": "system"
}
}
1、创建数据结构
public class Root
{
public string devicename{ get; set; }
public Propertydate propertydate{ get; set; }
}
public class Propertydate
{
public string id{ get; set; }
public string status{ get; set; }
public string types{ get; set; }
}
Root root=new Root();
Propertydate propertydate=new Propertydate();
JavaScriptSerializer js = new JavaScriptSerializer(); //实例化一个能够序列化数据的类
root= js.Deserialize<Demo>(json);//这个json即为上述字符串
propertydate=root.propertydate;
这样简单5行就把所有需要的值获取到了;
那么如何解决动态 属性的 JSON 字符串,如下所示 json1 与 json2;
//json1:
{
"datashape": {
"fieldDefinitions": {
"activePower": {
"name": "activePower",
"description": "有功功率",
"baseType": "NUMBER",
"ordinal": 0,
"aspects": {
"isPersistent": true,
"units": "kW"
}
}
}
},
"rows": {
"activePower": 0.7
}
}
//json2
{
"datashape": {
"fieldDefinitions": {
"reactivePower": {
"name": "activePower",
"description": "无功功率",
"baseType": "NUMBER",
"ordinal": 0,
"aspects": {
"isPersistent": true,
"units": "kW"
}
}
}
},
"rows": {
"reactivePower": 0.7
}
}
这里 json1 和 json2 在数据结构上时保持一致的,但是内部属性会根据功率不同变化。要解析这种多层动态变化的 json ,需要我们手动 去剥离动态变化的属性,把动态的属性剥离掉就可以拿到数据值。解决步骤如下:
1、创建数据结构
public class Root
{
public DataShape datashape { get; set; }
public CRows rows { get; set; }
}
public class CRows
{
public float activePower { get; set; }
}
public class DataShape
{
public FieldDefinitions fieldDefinitions { get; set; }
}
public class FieldDefinitions
{
public ActivePower activePower { get; set; }
}
public class ActivePower
{
public string name { get; set; }
public string description { get; set; }
public string baseType { get; set; }
public int ordinal { get; set; }
public Aspects aspects { get; set; }
}
利用 dynamic 动态类型逐步去分解(这里可以写一个递归去判断,这里为了简单演示就没有写了),将每一层的结果保存在 Dictionary<string, string>字典中,不断分解实现数据获取。
public static void GetValueForJson(string json,out Demo activePower,out float value)
{
var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json.ToString());
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in DynamicObject)
{
dic.Add(item.Name.ToLower(), item.Value.ToString());
}
string jstr2 = "";
KeyValuePair<string, string> kv1 = dic.ElementAt(0);
string jstr1 = kv1.Value;
var DynamicObject2 = JsonConvert.DeserializeObject<dynamic>(jstr1.ToString());
Dictionary<string, string> dic_1 = new Dictionary<string, string>();
foreach (var item in DynamicObject2)
{
dic_1.Add(item.Name.ToLower(), item.Value.ToString());
}
KeyValuePair<string, string> kv1_1 = dic_1.ElementAt(0);
string jstr1_1 = kv1_1.Value;
var DynamicObject3 = JsonConvert.DeserializeObject<dynamic>(jstr1_1.ToString());
Dictionary<string, string> dic_2 = new Dictionary<string, string>();
foreach (var item in DynamicObject3)
{
dic_2.Add(item.Name.ToLower(), item.Value.ToString());
}
KeyValuePair<string, string> kv1_2 = dic_2.ElementAt(0);
string jstr1_23 = kv1_2.Value;
JavaScriptSerializer js = new JavaScriptSerializer(); //实例化一个能够序列化数据的类
activePower = js.Deserialize<Demo>(jstr1_23);
KeyValuePair<string, string> kv2 = dic.ElementAt(1);
jstr2 = kv2.Value;
var DynamicObject4 = JsonConvert.DeserializeObject<dynamic>(jstr2.ToString());
Dictionary<string, string> dic_3 = new Dictionary<string, string>();
foreach (var item in DynamicObject4)
{
dic_3.Add(item.Name.ToLower(), item.Value.ToString());
}
KeyValuePair<string, string> kv1_3 = dic_3.ElementAt(0);
value = float.Parse(kv1_3.Value);
}
案例源代码下载:ConsoleApp5.rar-互联网文档类资源-CSDN文库