[英]Using JSON in C# deserialized into a dictionary
我將JSON數據反序列化為字典。 這就是我的JSON數據:
{
"InputKoffRetStats":true,"InputPenaltyStats":false,
"VisitingTeamFootballRbStats":
[{
"AthleteLastName":"John",
"AthleteFirstName":"Smith","Number":9,"IsPresent":true
},
{
"AthleteLastName":"Justin",
"AthleteFirstName":"Brooks","Number":10,"IsPresent":false
}]
}
這就是我將字符串反序列化為字典的方式:
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
我遇到的問題是我不知道如何獲得,例如,第一個運動員的姓(約翰)。
如果我這樣做:
Console.WriteLine(dict["InputKoffRetStats"]);
然后我得到“真實”。 它工作正常。
如果我這樣做:
Console.WriteLine(dict["VisitingTeamFootballRbStats"]);
然后我得到了兩位運動員的信息(約翰和賈斯汀)。
我怎么能用字典才能得到第一個運動員的名字? 我嘗試了以下操作但沒有成功:
Console.WriteLine(dict["VisitingTeamFootballRbStats"][0]);
有任何想法嗎?
編輯:我應該提到我展示的json只是整個json的一小部分。 我只是舉了一個例子。
一個完整的工作示例:
public class Athlete
{
public string AthleteLastName { get; set; }
public string AthleteFirstName { get; set; }
public int Number { get; set; }
public bool IsPresent { get; set; }
}
public class Stat
{
public bool InputKoffRetStats { get; set; }
public bool InputPenaltyStats { get; set; }
public List<Athlete> VisitingTeamFootballRbStats { get; set; }
}
class Program
{
static void Main(string[] args)
{
var jsonText = "{" +
" \"InputKoffRetStats\":true,\"InputPenaltyStats\":false," +
" \"VisitingTeamFootballRbStats\":" +
" [{" +
" \"AthleteLastName\":\"John\"," +
" \"AthleteFirstName\":\"Smith\",\"Number\":9,\"IsPresent\":true" +
" }," +
" {" +
" \"AthleteLastName\":\"Justin\"," +
" \"AthleteFirstName\":\"Brooks\",\"Number\":10,\"IsPresent\":false" +
" }]" +
"}";
var stat = JsonConvert.DeserializeObject<Stat>(jsonText);
Console.WriteLine(stat.VisitingTeamFootballRbStats[0].AthleteFirstName);
Console.ReadKey();
}
}
PS。:您提供的JSON中存在錯誤。 一旦你使用"IsPresent"
作為布爾值: "IsPresent":true
,下次你將它用作字符串時: "IsPresent":No
(錯誤地,因為No應該是“No”)。 無論如何,我更正了"IsPresent":false
。
更新 :如果你想要“類似JavaScript”的行為,那么你希望能夠做someObj["someProperty"]["someNestedProperty"]
你可以這樣做:
var stat = JsonConvert.DeserializeObject<JObject>(jsonText);
所以要獲得第一名運動員的名字:
var firstName = stat["VisitingTeamFootballRbStats"][0]["AthleteFirstName"].Value<string>();
也就是說,我仍然會為JSON中的所有可能字段創建適當的類。
反序列化的另一種方法是創建一個JsonProperty類,如下所示:
public class VisitingTeamFootballRbStats
{
[JsonProperty("AthleteLastName")]
public string AthleteLastName{ get; set; }
[JsonProperty("AthleteFirstName")]
public string AthleteFirstName{ get; set; }
[JsonProperty("Number")]
public string Number{ get; set; }
[JsonProperty("IsPresent")]
public string IsPresent{ get; set; }
}
然后將其反序列化如下:
List<VisitingTeamFootballRbStats> visitingTeams = JsonConvert.DeserializeObject<List<VisitingTeamFootballRbStats>>(jsonString["VisitingTeamFootballRbStats"].ToString());
因此,一旦您獲得列表,您可以輕松獲得運動員的詳細信息如下:
visitingTeams.ElementAt(0).AthleteLastName;
或者你可以使用linq。
你的代碼不起作用,因為你的json對象不是字典,這里是一個自定義對象,它看起來像是一個序列化的字典
{"team1":[{"AthleteLastName":"v2",
"AthleteFirstName":"v1",
"Number":2,
"IsPresent":false}]}
這里有一個完整的例子
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
var team= "{" +
" \"InputKoffRetStats\":true,\"InputPenaltyStats\":false," +
" \"VisitingTeamFootballRbStats\":" +
" [{" +
" \"AthleteLastName\":\"John\"," +
" \"AthleteFirstName\":\"Smith\",\"Number\":9,\"IsPresent\":true" +
" }," +
" {" +
" \"AthleteLastName\":\"Justin\"," +
" \"AthleteFirstName\":\"Brooks\",\"Number\":10,\"IsPresent\":false" +
" }]" +
"}";
var desTeam = JsonConvert.DeserializeObject<Team>(team);
Console.WriteLine(desTeam.VisitingTeamFootballRbStats[0].AthleteFirstName);
}
}
public class Team{
public bool InputKoffRetStats { get; set; }
public bool InputPenaltyStats { get; set; }
public List<AthleteInfo> VisitingTeamFootballRbStats { get; set; }
}
public class AthleteInfo
{
public string AthleteLastName { get; set; }
public string AthleteFirstName { get; set; }
public int Number { get; set; }
public bool IsPresent { get; set; }
}
}
UPDATE
如果你使用webapi / wcf,你可以要求數據合同,否則你可以使用動態對象
請注意,通過使用動態對象,您將失去intellisense的支持
碼
//same json string
dynamic desDynTeam = JObject.Parse(team);
Console.WriteLine(desDynTeam.VisitingTeamFootballRbStats[0].AthleteLastName);
VisitingTeamFootballRbStats數組變得很長,或者JSON中的外部有其他字段。 如果JSON是已知的並且不會改變,我仍然會在我的.NET項目中添加適當的類並反序列化。
dict["VisitingTeamFootballRbStats"][0]
您提供整個Athlete
對象。
要訪問名稱,請使用.AthleteFirstName
像這樣:
dict["VisitingTeamFootballRbStats"][0].AthleteFirstName
你有沒有檢查過.NET中的動態 ? 這是一個使用Newtonsoft.Json的簡單控制台應用程序 ,它顯示了如何在JSON對象上訪問這些屬性:
static void Main(string[] args)
{
dynamic dObject = JObject.Parse(json);
Console.WriteLine(dObject.VisitingTeamFootballRbStats[0].AthleteLastName);
//Prints "John"
Console.ReadLine();
}
private static string json = @"
{
'InputKoffRetStats':true,'InputPenaltyStats':false,
'VisitingTeamFootballRbStats':
[{
'AthleteLastName':'John',
'AthleteFirstName':'Smith','Number':9,'IsPresent':true
},
{
'AthleteLastName':'Justin',
'AthleteFirstName':'Brooks','Number':10,'IsPresent':false
}]
}
";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.