动态Json字符串的解析

  • 对于传统的Json字符串,比如有规定属性的对象,通常都会采用反序列化的方式就可以了,例如下面的方式:
  1. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
  2. MemoryStream ms = newMemoryStream(Encoding.UTF8.GetBytes(jsonString));
  3. T obj = (T)ser.ReadObject(ms);

但是有时候会出现动态的json字符串,例如:

  1. {
  2. "workOrderId": "WO170330000375",
  3. "workOrderData": {
  4. "workOrderId": "WO170330000376",
  5. "statusDesc": "执行中",
  6. "modifyUserId": "system",
  7. "modifyUserName": "system"
  8. },
  9. "formData": {
  10. "id": "WO170330000377",
  11. "data": {
  12. "dbTypes_text": [
  13. "SqlServer",
  14. "MySql"
  15. ],
  16. }
  17. },
  18. "approvalLogs": [
  19. {
  20. "workOrderId": "WO170330000379",
  21. "remark": "同意",
  22. "createTime": {
  23. "date": 30,
  24. "hours": 17,
  25. "seconds": 32
  26. }
  27. },
  28. {
  29. "workOrderId": "WO170330000380",
  30. "remark": "同意",
  31. "createTime": {
  32. "date": 30,
  33. "hours": 17,
  34. "seconds": 46
  35. }
  36. }
  37. ]
  38. }

解析上述字符串

需要引用第三方类库 <Newtonsoft.Json>

取workOrderId值

  1. var jsonobject = JsonConvert.DeserializeObject<JObject>(strJson);
  2. Console.WriteLine(jsonobject["workOrderId"]);

判断节点中是否存在某个元素

  1. JObject jo = JObject.Parse(strJson);
  2. if (jo.Properties().Any(p => p.Name == "workOrderId"))
  3. Console.WriteLine("true");

采用JProperty来获取

  1. IEnumerable<JProperty> properties = jo.Properties();
  2. foreach (JProperty item in properties)
  3. {
  4. if (item.Name.Equals("workOrderId"))
  5. {
  6. Console.WriteLine(item.Name + ":" + item.Value);
  7. }
  8. }

取modifyUserId值

  1. var node = jo["workOrderData"]["modifyUserId"];
  2. Console.WriteLine(node.ToString());
  3. //或者
  4. var childss = jo["workOrderData"] as JObject;
  5. foreach (var prip in childss.Properties())
  6. {
  7. Console.WriteLine("key:" + (prip.Name + " values:" + (prip.Value)));
  8. }
  9. //或者
  10. var childs = jo["workOrderData"].Children();
  11. IEnumerator enumerator = childs.GetEnumerator();
  12. while (enumerator.MoveNext())
  13. {
  14. if (enumerator.Current != null)
  15. {
  16. var jtoken = (JToken)enumerator.Current;
  17. if (((JProperty)jtoken).Name.Equals("modifyUserId"))
  18. Console.WriteLine("key:" + ((JProperty)jtoken).Name + " values:" + ((JProperty)jtoken).Value);
  19. }
  20. }

取approvalLogs下的remark值

  1. var arra = (JArray)jo["approvalLogs"];//JArray.Parse(jo["approvalLogs"].ToString());
  2. foreach (var item in arra)
  3. {
  4. Console.WriteLine(((JObject)item).GetValue("remark"));
  5. }
  6. //或者
  7. var nodes = jo["approvalLogs"].Children();
  8. foreach (var log in nodes)
  9. {
  10. Console.WriteLine(((JObject)log)["remark"]);
  11. }
  12. //或者
  13. foreach (var log in nodes)
  14. {
  15. Console.WriteLine(((JObject)log).Property("remark").Value.ToString());
  16. }

取formData下的dbTypes_text的值

  1. var data = (jo["formData"] as JObject).GetValue("data");
  2. var result = ((JObject)data)["dbTypes_text"];
  3. foreach (var item in JArray.Parse(result.ToString()))// (JArray)result
  4. {
  5. Console.WriteLine(item);
  6. }
  7. //或者
  8. var values = result.Children().Values();
  9. foreach (var obj in values)
  10. {
  11. Console.WriteLine(obj.ToString());
  12. }
  13. Console.Read();

递归调用获取节点的方法

  1. private string GetJsonValue(JToken jToken, string key)
  2. {
  3. var value = string.Empty;
  4. if (!(jToken is JObject)) return value;
  5. var jobj = ((JObject)jToken).Property(key);
  6. if (jobj == null)
  7. {
  8. if (jToken is JObject || (jToken is JProperty && ((JProperty)jToken).Value is JObject))
  9. {
  10. if (jToken.Children().Count() > 0)
  11. {
  12. value = GetJsonValue(jToken.Children(), key);
  13. }
  14. }
  15. if (string.IsNullOrWhiteSpace(value) && jToken is JProperty)
  16. {
  17. if (((JProperty)jToken).Name == key)
  18. {
  19. value = ((JProperty)jToken).Value.ToString();
  20. }
  21. }
  22. }
  23. else
  24. {
  25. value = jToken[key].ToString();
  26. }
  27. return value;
  28. }
  29. private string GetJsonValue(JEnumerable<JToken> jToken, string key)
  30. {
  31. var value = string.Empty;
  32. IEnumerator enumerator = jToken.GetEnumerator();
  33. while (enumerator.MoveNext())
  34. {
  35. if (enumerator.Current != null)
  36. {
  37. var current = enumerator.Current;
  38. JToken jc = (JToken)current;
  39. if (jc is JObject || (jc is JProperty && ((JProperty)jc).Value is JObject))
  40. {
  41. if (jc.Children().Count() > 0)
  42. {
  43. value = GetJsonValue(jc.Children(), key);
  44. }
  45. }
  46. if (string.IsNullOrWhiteSpace(value) && jc is JProperty)
  47. {
  48. if (((JProperty)jc).Value is JArray)
  49. {
  50. var ja = (JArray)((JProperty)jc).Value;
  51. foreach (var j in ja)
  52. {
  53. value = GetJsonValue(j, key);
  54. if (!string.IsNullOrWhiteSpace(value))
  55. break;
  56. }
  57. }
  58. if (((JProperty)jc).Name == key && string.IsNullOrWhiteSpace(value))
  59. {
  60. value = ((JProperty)jc).Value.ToString();
  61. }
  62. }
  63. }
  64. if (!string.IsNullOrWhiteSpace(value))
  65. break;
  66. }
  67. return value;
  68. }

动态Json字符串的解析的更多相关文章

  1. Kotlin入门(31)JSON字符串的解析

    json是App进行网络通信最常见的数据交互格式,Android也自带了json格式的处理工具包org.json,该工具包主要提供了JSONObject(json对象)与JSONArray(json数 ...

  2. JSON字符串——后台解析系列

    以前我们都是讲JSON字符串获取后,在前台进行展示.今天小编就交给大家后台解析展示数据的方法.非常方便,就以下代码: JObject obj = JObject.Parse(data); string ...

  3. HttpClient 模拟发送Post和Get请求 并用fastjson对返回json字符串数据解析,和HttpClient一些参数方法的deprecated(弃用)的综合总结

    最近在做一个接口调用的时候用到Apache的httpclient时候,发现引入最新版本4.5,DefaultHttpClient等老版本常用的类已经过时了,不推荐使用了:去官网看了一下在4.3之后就抛 ...

  4. jquery对JSON字符串的解析--eval函数

    jquery eval解析JSON中的注意点介绍----https://www.jb51.net/article/40842.htm

  5. js fs read json 文件json字符串无法解析

    读取 xxx.txt(里面就是一段 json)-> JSON.parse( fs.readFileSync( xxx.txt ) ) -> 报 SyntaxError: unexpecte ...

  6. Asp.Net对Json字符串的解析和应用

    using System.Web.Script.Serialization; protected void Page_Load(object sender,EventArgs e) { //构建jso ...

  7. Python编程 - json字符串的解析

    import json jsonString = '{"arrayOfNums":[{"number":0},{"number":1},{& ...

  8. JSON字符串解析

    有时保存在数据库的数据是一串json字符串,需要进行读取的时候就需要解析操作. 简单介绍两种: 1.net.sf.json.* 2.com.alibaba.fastjson.* 需要的包自行下载. 第 ...

  9. Json字符串解析原理、超大json对象的解析

    概述 附上完整的代码:https://pan.baidu.com/s/1dEDmGz3(入口类是Json)JSON:JavaScript 对象表示法(JavaScript Object Notatio ...

随机推荐

  1. 从0开始 Java学习 packet用法

    packet 包的用法 参考博客:https://www.cnblogs.com/Ring1981/p/6240412.html 用法 java 源文件带有包名,往往容易出错 如:H:\code\He ...

  2. SpringBoot创建定时任务

    之前总结过spring+quartz实现定时任务的整合http://www.cnblogs.com/gdpuzxs/p/6663725.html,而springboot创建定时任务则是相当简单. (1 ...

  3. 《用 Python 学微积分》笔记 3

    <用 Python 学微积分>原文见参考资料 1. 16.优化 用一个给定边长 4 的正方形来折一个没有盖的纸盒,设纸盒的底部边长为 l,则纸盒的高为 (4-l)/2,那么纸盒的体积为: ...

  4. 前端解析cookie出现多余的双引号的问题

    登录界面,用户提交后,后台获取到用户名密码,然后会设置cookie,以便于前端使用,今天在修改项目记住密码的功能的时候,读取cookie,如果存在loginInfo字段说明用户在上一次点击了记住密码的 ...

  5. 实现Promise的first等各种变体

    本篇文章主要是想通过ES6中Promise提供的几个方法,来实现诸如first.last.none.any等各种变体方法! 在标准的ES6规范中,提供了Promise.all和Promise.race ...

  6. IDEA运行时Information:java: Errors occurred while compiling module!

    在网上找了资源 说看一下项目JDK,字符编码UTF-8,但是都不很实用,突然发现: IDEA的右下角改变字符编码的按钮,先改成GBK然后再改成UTF-8,然后就OK了. 原因:导入开源的项目的时候,你 ...

  7. Highcharts 基本条形图;Highcharts 堆叠条形图;Highcharts 反向条形图

    Highcharts 基本条形图 配置 chart 配置 设置 chart 的 type 属性 为 bar ,chart.type 描述了图表类型.默认值为 "line". var ...

  8. C++ 进阶5 拷贝构造 深度复制 运算符重载

    C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * *  Created on: 2013年10月26日 *      ...

  9. webapi在IIS发布后报Http 403.14 error

    服务器是Windows Server 2008 R2 Enterprise IIS6.1     解决方法,修改web.config文件   1.在<system.webServer>配置 ...

  10. Centos6安装MariaDB-yum方式

    1.创建安装目录: mkdir /data/mysql/ mkdir /data/mysql/datafile mkdir /data/mysql/logfile 2.创建用户: useradd -r ...