动态Json字符串的解析

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

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

{
"workOrderId": "WO170330000375",
"workOrderData": {
"workOrderId": "WO170330000376",
"statusDesc": "执行中",
"modifyUserId": "system",
"modifyUserName": "system"
},
"formData": {
"id": "WO170330000377",
"data": {
"dbTypes_text": [
"SqlServer",
"MySql"
], }
},
"approvalLogs": [
{
"workOrderId": "WO170330000379",
"remark": "同意",
"createTime": {
"date": 30,
"hours": 17,
"seconds": 32
}
},
{
"workOrderId": "WO170330000380",
"remark": "同意",
"createTime": {
"date": 30,
"hours": 17,
"seconds": 46
}
}
]
}

解析上述字符串

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

取workOrderId值

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

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

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

采用JProperty来获取

IEnumerable<JProperty> properties = jo.Properties();
foreach (JProperty item in properties)
{
if (item.Name.Equals("workOrderId"))
{
Console.WriteLine(item.Name + ":" + item.Value);
}
}

取modifyUserId值

var node = jo["workOrderData"]["modifyUserId"];
Console.WriteLine(node.ToString()); //或者
var childss = jo["workOrderData"] as JObject;
foreach (var prip in childss.Properties())
{
Console.WriteLine("key:" + (prip.Name + " values:" + (prip.Value)));
} //或者
var childs = jo["workOrderData"].Children();
IEnumerator enumerator = childs.GetEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Current != null)
{
var jtoken = (JToken)enumerator.Current;
if (((JProperty)jtoken).Name.Equals("modifyUserId"))
Console.WriteLine("key:" + ((JProperty)jtoken).Name + " values:" + ((JProperty)jtoken).Value);
}
}

取approvalLogs下的remark值

var arra = (JArray)jo["approvalLogs"];//JArray.Parse(jo["approvalLogs"].ToString());
foreach (var item in arra)
{
Console.WriteLine(((JObject)item).GetValue("remark"));
}
//或者
var nodes = jo["approvalLogs"].Children();
foreach (var log in nodes)
{
Console.WriteLine(((JObject)log)["remark"]);
}
//或者
foreach (var log in nodes)
{
Console.WriteLine(((JObject)log).Property("remark").Value.ToString());
}

取formData下的dbTypes_text的值

var data = (jo["formData"] as JObject).GetValue("data");
var result = ((JObject)data)["dbTypes_text"];
foreach (var item in JArray.Parse(result.ToString()))// (JArray)result
{
Console.WriteLine(item);
}
//或者
var values = result.Children().Values();
foreach (var obj in values)
{
Console.WriteLine(obj.ToString());
}
Console.Read();

递归调用获取节点的方法

    private string GetJsonValue(JToken jToken, string key)
{
var value = string.Empty;
if (!(jToken is JObject)) return value;
var jobj = ((JObject)jToken).Property(key);
if (jobj == null)
{
if (jToken is JObject || (jToken is JProperty && ((JProperty)jToken).Value is JObject))
{
if (jToken.Children().Count() > 0)
{
value = GetJsonValue(jToken.Children(), key);
}
}
if (string.IsNullOrWhiteSpace(value) && jToken is JProperty)
{
if (((JProperty)jToken).Name == key)
{
value = ((JProperty)jToken).Value.ToString();
}
}
} else
{
value = jToken[key].ToString();
}
return value;
}
private string GetJsonValue(JEnumerable<JToken> jToken, string key)
{
var value = string.Empty;
IEnumerator enumerator = jToken.GetEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Current != null)
{
var current = enumerator.Current; JToken jc = (JToken)current;
if (jc is JObject || (jc is JProperty && ((JProperty)jc).Value is JObject))
{
if (jc.Children().Count() > 0)
{
value = GetJsonValue(jc.Children(), key);
}
}
if (string.IsNullOrWhiteSpace(value) && jc is JProperty)
{
if (((JProperty)jc).Value is JArray)
{
var ja = (JArray)((JProperty)jc).Value;
foreach (var j in ja)
{ value = GetJsonValue(j, key);
if (!string.IsNullOrWhiteSpace(value))
break;
}
}
if (((JProperty)jc).Name == key && string.IsNullOrWhiteSpace(value))
{
value = ((JProperty)jc).Value.ToString();
}
} }
if (!string.IsNullOrWhiteSpace(value))
break;
}
return value;
}

动态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. BZOJ3236: [AHOI2013]作业

    BZOJ3236: [AHOI2013]作业 题目描述 传送门 行,我知道是Please contact lydsy2012@163.com! 传送门2 题目分析 这题两问还是非常,emmmm. 首先 ...

  2. 解题报告: hdu 3949 - 线性基

    #include <iostream> #include <cstdio> #define LL long long using namespace std; const in ...

  3. 获取远程html

    /// <summary> /// 获取远程html /// </summary> /// <param name="url"></par ...

  4. hdu 1241 搬寝室 水dp

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  5. http & https & http2.0

    一.http状态码 1xx(信息性状态码,接受的请求正在处理) 2xx(成功状态码,请求正常处理完毕)200 OK204 No Content:请求成功但没有资源返回206 Partial Conte ...

  6. ElasticSearch + Canal 开发千万级的实时搜索系统【转】

    公司是做社交相关产品的,社交类产品对搜索功能需求要求就比较高,需要根据用户城市.用户ID昵称等进行搜索. 项目原先的搜索接口采用SQL查询的方式实现,数据库表采用了按城市分表的方式.但随着业务的发展, ...

  7. C# 过滤HTML,脚本,数据库关键字,特殊字符

    /// <summary> /// 过滤标记 /// </summary> /// <param name="NoHTML">包括HTML,脚本 ...

  8. 15个Android通用流行框架大全

    1. 缓存 DiskLruCache  Java实现基于LRU的磁盘缓存 2.图片加载 Android Universal Image Loader  一个强大的加载,缓存,展示图片的库 Picass ...

  9. opencv颜色提取color filting

    # -*- coding: utf-8 -* import numpy as np import cv2 cap = cv2.VideoCapture(0) while True: _ , frame ...

  10. configParse模块

    一.配置文件简介 在各种程序里面都有配置文件,为了对配置文件进行操作. python中引入了configParse模块进行操作. 配置数值类型: 配置文件中,我们看到的bool型,整数型,在我们操作的 ...