C# 解析key值动态的json数据

需求:对于传统的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文库

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌霜残雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值