mysql 动态sql 解析json_动态Json字符串的解析

这篇博客介绍了如何处理和解析动态JSON字符串,包括获取特定字段的值,判断节点是否存在,以及遍历复杂嵌套结构。示例代码展示了使用Newtonsoft.Json库的JObject和JToken类进行操作的方法,如获取`workOrderId`,`modifyUserId`,`approvalLogs`的`remark`以及`formData`的`dbTypes_text`等信息。
摘要由CSDN通过智能技术生成

动态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

}

}

]

}

解析上述字符串

需要引用第三方类库

取workOrderId值

var jsonobject = JsonConvert.DeserializeObject(strJson);

Console.WriteLine(jsonobject["workOrderId"]);

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

JObject jo = JObject.Parse(strJson);

if (jo.Properties().Any(p => p.Name == "workOrderId"))

Console.WriteLine("true");

采用JProperty来获取

IEnumerable 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, 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值