C# 獲取動(dòng)態(tài)key的json對(duì)象的值案例
問題描述
如果直接獲取某個(gè)json數(shù)組中的元素將得到如下的json
{
"44": {
"height": 25,
"appeared": -70000000,
"length": 44,
"order": "saurischia",
"vanished": -70000000,
"weight": 135000
}
}
這個(gè)json對(duì)象如果使用C#類來反序列化,那么實(shí)體類的結(jié)構(gòu)如下,實(shí)體類的類名需要與json對(duì)象key相同的才可以使用json反序列化,這樣對(duì)程序造成了極大的不便。
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對(duì)象由于key是動(dòng)態(tài)的無法使用C#反序列化,但是直接取到value就能序列化了,如下。
{
"height":25,
"appeared":-70000000,
"length":44,
"order":"saurischia",
"vanished":-70000000,
"weight":135000
}
以上json對(duì)象就可以使用我們常用的格式轉(zhuǎn)換了。
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; }
}
實(shí)現(xiàn)代碼
從動(dòng)態(tài)key的json對(duì)象里面拿到value那部分,可以反序列化的字符串,請(qǐng)使用如下的函數(shù),注意引入類庫。
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Linq;
/// <summary>
/// 本類用于處理動(dòng)態(tài)Key的json對(duì)象
/// </summary>
/// <param name="jObject">需要處理的json對(duì)象</param>
/// <returns>json對(duì)象的第一個(gè)元素的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;
}
補(bǔ)充:C# 獲取JSON字符串中指定KEY的值
背景
從Markdown系統(tǒng)API接口獲取到JSON格式數(shù)據(jù),JSON字符串是不規(guī)范的或者說是很難以獲取doc_id字段(位于樹的葉子節(jié)點(diǎn),但是卻不知道有多少個(gè)枝干節(jié)點(diǎn)),這時(shí)想到了采用正則表達(dá)式獲取指定KEY的值,于是產(chǎn)生了這篇文章。
適用場(chǎng)景
不想要解析整個(gè)JSON字符串,只想獲取其中某個(gè)KEY的值
JSON字符串對(duì)應(yīng)的對(duì)象比較難以構(gòu)造,只需要獲取其中某幾個(gè)KEY的值
JSON字符串不規(guī)范,只需要獲取指定KEY的值(特別是有一些是數(shù)組對(duì)象,有一些是非數(shù)據(jù)對(duì)象)
代碼
/// <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;
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C# 建造者模式(Builder Pattern)詳細(xì)講解
建造者模式是一種創(chuàng)建型設(shè)計(jì)模式,通過將復(fù)雜對(duì)象的構(gòu)建過程與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示,它適用于構(gòu)建過程復(fù)雜且涉及多個(gè)步驟的場(chǎng)景,本文介紹C# 建造者模式(Builder Pattern)詳細(xì)講解,感興趣的朋友一起看看吧2025-03-03
C#中使用強(qiáng)制類型實(shí)現(xiàn)字符串和ASCII碼之間的轉(zhuǎn)換
這篇文章主要介紹了C#中使用強(qiáng)制類型實(shí)現(xiàn)字符串和ASCII碼之間的轉(zhuǎn)換,本文還給出了另一種方法,需要的朋友可以參考下2014-08-08
C#預(yù)定義數(shù)據(jù)類型之值類型和引用類型介紹
這篇文章主要介紹了C#預(yù)定義數(shù)據(jù)類型之值類型和引用類型介紹,本文著重講解了引用類型中的object(對(duì)象)類型和string(字符串)類型,需要的朋友可以參考下2015-03-03

