C# 獲取動態key的json對象的值案例
問題描述
如果直接獲取某個json數組中的元素將得到如下的json
{ "44": { "height": 25, "appeared": -70000000, "length": 44, "order": "saurischia", "vanished": -70000000, "weight": 135000 } }
這個json對象如果使用C#類來反序列化,那麼實體類的結構如下,實體類的類名需要與json對象key相同的才可以使用json反序列化,這樣對程序造成瞭極大的不便。
public class 44 { public int height { get; set; } public int appeared { get; set; } public int length { get; set; } public string order { get; set; } public int vanished { get; set; } public int weight { get; set; } } public class Root { public 44 44 { get; set; } }
解決方案
以上json對象由於key是動態的無法使用C#反序列化,但是直接取到value就能序列化瞭,如下。
{ "height":25, "appeared":-70000000, "length":44, "order":"saurischia", "vanished":-70000000, "weight":135000 }
以上json對象就可以使用我們常用的格式轉換瞭。
public class Root { public int height { get; set; } public int appeared { get; set; } public int length { get; set; } public string order { get; set; } public int vanished { get; set; } public int weight { get; set; } }
實現代碼
從動態key的json對象裡面拿到value那部分,可以反序列化的字符串,請使用如下的函數,註意引入類庫。
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Linq;
/// <summary> /// 本類用於處理動態Key的json對象 /// </summary> /// <param name="jObject">需要處理的json對象</param> /// <returns>json對象的第一個元素的values</returns> public static string GetJsonValue(string strJson) { string strResult; JObject jo = JObject.Parse(strJson); string[] values = jo.Properties().Select(item => item.Value.ToString()).ToArray(); if (values == null) { strResult = ""; } else { strResult = values[0]; } return strResult; }
補充:C# 獲取JSON字符串中指定KEY的值
背景
從Markdown系統API接口獲取到JSON格式數據,JSON字符串是不規范的或者說是很難以獲取doc_id字段(位於樹的葉子節點,但是卻不知道有多少個枝幹節點),這時想到瞭采用正則表達式獲取指定KEY的值,於是產生瞭這篇文章。
適用場景
不想要解析整個JSON字符串,隻想獲取其中某個KEY的值
JSON字符串對應的對象比較難以構造,隻需要獲取其中某幾個KEY的值
JSON字符串不規范,隻需要獲取指定KEY的值(特別是有一些是數組對象,有一些是非數據對象)
代碼
/// <summary> /// 獲取JSON字符串中指定KEY的值 /// </summary> /// <param name="jsonString"></param> /// <param name="key"></param> /// <returns></returns> public List<String> GetJsonValue(String jsonString, String key) { String pattern = $"\"{key}\":\"(.*?)\\\""; MatchCollection matches = Regex.Matches(jsonString, pattern, RegexOptions.IgnoreCase); List<string> lst = new List<string>(); foreach (Match m in matches) { lst.Add(m.Groups[1].Value); } return lst; }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。