相关文章推荐
暗恋学妹的柳树  ·  zzz的个人博客 - 知乎·  10 月前    · 
温暖的枕头  ·  android.os.deadobjecte ...·  1 年前    · 
淡定的地瓜  ·  二维矩阵最短路径-掘金·  1 年前    · 

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

需求:对于传统的Json字符串,比如有规定属性的对象,通常都会采用反序列化的方式就可以了;同样,如果出现不同属性,但具有相同的数据结构是,采用同一个接口传输时,就导致JSON数据属性动态变化,出现动态JSON.例如处理固定属性结构的json:(devicename、propertydate、id、status、types 属性不变化,数值发生变化)json字符串:{ "devicename": "WO170330000375", "propertydate": { ...
本文实例讲述了C#实现json格式转换成对象并更换key的方法。分享给大家供大家参考。具体分析如下: 由于是不标准的序列化对象类型,因此你无法通过标准的反序列化类来实现,需要自定义一个序列化类或者简单点,直接自定义一个方法解析Json数据解析后的数据用Dictionary来存放。 string str = {\name\: \甄嬛体\,\2012-05-04 14:59\: \5724\}; JavaScriptObject obj = JavaScriptConvert.DeserializeObject(str) as JavaScriptObject; forea
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。 今天用python解析一个文本文件,格式如下: "Key":"android.permission.ACC
System.Web.Extensions c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Web.Extensions.dll 接下来就是两个函数了,一个是根据key获取,一个是根据index来获取 public static bool GetValue(string json, string key, out string value) /// 从json获取对应key的value /// &lt;/summary&gt; /// &lt;param name="json字符串"&gt;&lt;/param&gt; /// &lt;param name="需要取value对应的key"&gt;&am
本文实例讲述了C#实现解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市的方法,分享给大家供大家参考。具体实现方法如下: 一、百度天气 接口地址:http://api.map.baidu.com/telematics/v3/weather?location=上海&output=json&ak=hXWAgbsCC9UTkBO5V5Qg1WZ9,其ak是密钥,自行去申请即可,便于大家测试,楼主就公布并了自己的Key,这样可以直接获取数据获取到的数据是这样的: 代码如下:{“error”:0,”status”:”success”,”date”:”2014-10-27″,”resu
大多数情况下我们遇到的json数据一般都是key是固定的,方便我们创建对应的实体类对象来进行解析。但有时候也会有些特殊情况,key和value一样都是动态未知的情况。如下所示: data: { "姓名": "老王", "年龄": "41", "性别": "男", 那如何解决呢? 直接贴代码: JSONObject jsonObjec...
关于newtonsoft.json的使用常见问题参考: 《c#:序列化json常见问题及处理方法》 《c#:关于NewtonsoftJson序列化和Grpc序列化的冲突问题》 问题:如何在不新建类的情况下动态解析json字符串? "Color": { "Red": 0.8, "Blue": 1.2 "Category": {
Localstorage是一种在Web浏览器存储数据的技术,可以让Web应用程序在客户端存储键对。在C#解析localstorage需要使用JavaScriptSerializer类,该类是System.Web.Script.Serialization命名空间的一个类。以下是解析localstorage的C#代码示例: ```csharp using System.Web.Script.Serialization; // 引入 JavaScriptSerializer 类 // 从 Localstorage 获取数据 string data = (string)browser.EvaluateScript("localStorage.getItem('key')").Result; // 将 JSON 格式的字符串转换为 C# 对象 JavaScriptSerializer serializer = new JavaScriptSerializer(); dynamic obj = serializer.Deserialize<dynamic>(data); // 访问 C# 对象的属性 string value = obj["property"]; 在上面的代码,我们首先使用EvaluateScript方法从本地存储获取数据,然后使用JavaScriptSerializer类将JSON格式的字符串转换为C#对象。最后,我们可以访问C#对象的属性来获取
本人认为还可以参考:这篇文章,作为补充更易理解 《为什么使用依赖注入_c#之控制反转(IOC)和依赖注入(DI)的理解》 https://blog.csdn.net/weixin_39844963/article/details/110813704?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_default&utm_relevant_index=9