C# 获取动态key的json对象的值案例
问题描述
如果直接获取某个json数组中的元素将得到如下的json
{ "44":{ "height":25, "appeared":-70000000, "length":44, "order":"saurischia", "vanished":-70000000, "weight":135000 } }
这个json对象如果使用C#类来反序列化,那么实体类的结构如下,实体类的类名需要与json对象key相同的才可以使用json反序列化,这样对程序造成了极大的不便。
publicclass44 { publicintheight{get;set;} publicintappeared{get;set;} publicintlength{get;set;} publicstringorder{get;set;} publicintvanished{get;set;} publicintweight{get;set;} } publicclassRoot { public4444{get;set;} }
解决方案
以上json对象由于key是动态的无法使用C#反序列化,但是直接取到value就能序列化了,如下。
{ "height":25, "appeared":-70000000, "length":44, "order":"saurischia", "vanished":-70000000, "weight":135000 }
以上json对象就可以使用我们常用的格式转换了。
publicclassRoot { publicintheight{get;set;} publicintappeared{get;set;} publicintlength{get;set;} publicstringorder{get;set;} publicintvanished{get;set;} publicintweight{get;set;} }
实现代码
从动态key的json对象里面拿到value那部分,可以反序列化的字符串,请使用如下的函数,注意引入类库。
usingNewtonsoft.Json; usingNewtonsoft.Json.Linq; usingSystem.Linq;
//////本类用于处理动态Key的json对象 /// ///需要处理的json对象 /// json对象的第一个元素的values publicstaticstringGetJsonValue(stringstrJson) { stringstrResult; JObjectjo=JObject.Parse(strJson); string[]values=jo.Properties().Select(item=>item.Value.ToString()).ToArray(); if(values==null) { strResult=""; } else { strResult=values[0]; } returnstrResult; }
补充:C#获取JSON字符串中指定KEY的值
背景
从Markdown系统API接口获取到JSON格式数据,JSON字符串是不规范的或者说是很难以获取doc_id字段(位于树的叶子节点,但是却不知道有多少个枝干节点),这时想到了采用正则表达式获取指定KEY的值,于是产生了这篇文章。
适用场景
不想要解析整个JSON字符串,只想获取其中某个KEY的值
JSON字符串对应的对象比较难以构造,只需要获取其中某几个KEY的值
JSON字符串不规范,只需要获取指定KEY的值(特别是有一些是数组对象,有一些是非数据对象)
代码
//////获取JSON字符串中指定KEY的值 /// ////// /// publicList GetJsonValue(StringjsonString,Stringkey) { Stringpattern=$"\"{key}\":\"(.*?)\\\""; MatchCollectionmatches=Regex.Matches(jsonString,pattern,RegexOptions.IgnoreCase); List lst=newList (); foreach(Matchminmatches) { lst.Add(m.Groups[1].Value); } returnlst; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。