簡體   English   中英

C#從反序列化的json對象中獲取值

[英]C# get value from deserialized json object

我目前正在使用以下代碼使用Newtonsoft.Json nuget數據包反序列化一個json字符串:

var data = (JObject)JsonConvert.DeserializeObject(json);

現在我收到的格式如下:

{{  "meta": {    "rap": 2098,    "count": 5  },  "data": [    {      "name": "Gold Tetramino of Mastery",      "rap": 735,      "uaid": "16601901",      "link": "https://www.roblox.com/Gold-Tetramino-of-Mastery-item?id=5786047",      "img": "https://t4.rbxcdn.com/081337d7ea86e6a406512aaa83bbcdeb",      "serial": "---",      "count": 1    },    {      "name": "Silver Tetramino of Accomplishment",      "rap": 385,      "uaid": "16601900",      "link": "https://www.roblox.com/Silver-Tetramino-of-Accomplishment-item?id=5786026",      "img": "https://t1.rbxcdn.com/60da69cd76f8dad979326f63f4a5b657",      "serial": "---",      "count": 1    },    {      "name": "Subzero Ski Specs",      "rap": 370,      "uaid": "155175547",      "link": "https://www.roblox.com/Subzero-Ski-Specs-item?id=19644587",      "img": "https://t4.rbxcdn.com/8ead2b0418ef418c7650d34103d39b6d",      "serial": "---",      "count": 1    },    {      "name": "Rusty Tetramino of Competence",      "rap": 319,      "uaid": "16601899",      "link": "https://www.roblox.com/Rusty-Tetramino-of-Competence-item?id=5785985",      "img": "https://t2.rbxcdn.com/968ad11ee2f4ee0861ae511c419148c8",      "serial": "---",      "count": 1    },    {      "name": "Bluesteel Egg of Genius",      "rap": 289,      "uaid": "16601902",      "link": "https://www.roblox.com/Bluesteel-Egg-of-Genius-item?id=1533893",      "img": "https://t7.rbxcdn.com/48bf59fe531dd1ff155e455367e52e73",      "serial": "---",      "count": 1    }  ]}}

現在我試圖從中獲取以下值:

"rap": 2098,

我只需要2098而且我一直在嘗試以下代碼:

string rap = data["rap"].Value<string>();

但遺憾的是,這不起作用。 有誰知道如何獲得價值?

嘗試:

var result = data["meta"]["rap"].Value<int>();

要么

var result = data.SelectToken("meta.rap").ToString();

或者如果您不想要傳遞整個路徑,您可以像這樣搜索屬性:

var result = data.Descendants()
                 .OfType<JProperty>()
                 .FirstOrDefault(x => x.Name == "rap")
                 ?.Value;

而不是聲明為類型var並讓編譯器對其進行排序,而是將其聲明為動態並使用Parse方法。

dynamic data = JArray.Parse(json);

然后試試

data.meta.rap

獲取內部說唱對象。 我使用deserializeobject方法進行了編輯,因為我錯誤地認為它具有動態返回類型。 有關更多詳細信息,請參閱json.net文檔: http//www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

var jobject = (JObject)JsonConvert.DeserializeObject(json);
var jvalue = (JValue)jobject["meta"]["rap"];
Console.WriteLine(jvalue.Value); // 2098

該值實際上是一個int類型。 嘗試:

int rap = data["rap"].Value<int>();
string rap = JsonConvert.DeserializeObject<dynamic>(json).meta.rap;
Console.WriteLine(rap); // 2098

如果你沒有dynamic (或者沒有使用.NET 4+),我喜歡這個其他答案如何完全依賴於Json.NET的API。

只需使用對象的動態表示:

dynamic obj = JsonConvert.DeserializeObject(json)
var value = obj.meta.rap;

JObject可以輕松轉換為動態類型本身。 您可以從此值獲取字符串或int:

var ivalue = (int)obj.meta.rap;
var svalue = (string)obj.meta.rap;

嘗試使用如下

var test = JsonConvert.DeserializeObject<dynamic>(param);

var testDTO = new TPRDTO();
testDTO.TPR_ID = test.TPR_ID.Value;

注意:要使用JsonConvert類,必須從包管理器安裝Newton-Soft

問題是你將反序列化的json轉換為JObject。 如果你想擁有JObject那么簡單這樣做:

JObject.Parse(json); 

然后你有JObject,你可以訪問一個特定的路徑(提取值看到這個

你還有另一種選擇,就是將你的json反序列化為你的代碼中的類,如下所示:

var instanceOFTheClass =  JsonConvert.DeserializeObject<YourClassName>(json); 

使用上面的代碼,您可以訪問所需的任何屬性和值。

使用枚舉器獲取值:

var data = (JObject)JsonConvert.DeserializeObject(json);
var enumerator = data.GetEnumerator();
enumerator.MoveNext();
var dataValue = enumerator.Current.Value.ToString();

我剛剛添加另一種獲得2098的方法


以你實際做的方式得到你的對象之后:

var data = (JObject)JsonConvert.DeserializeObject(json);

首先要注意的是,您想要獲取的值本身就是屬性"meta"

Json對象內所需值的確切位置

所以,首先你必須通過簡單的調用來提取"meta"的內容

data["meta"]

然后你就可以要求"rap"Value<string>

String rap = data["meta"].Value<string>("rap");

它實際上為您提供了您正在尋找的價值:

Console.WriteLine(rap); // 2098

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM