JsonConvert.DeserializeObject和JObject.Parse有什么区别?据我所知,两者都采用一个字符串,并在Json.NET库中。什么样的情况会使一个比另一个更方便,还是主要是偏爱?
作为参考,这里是一个使用两者完全相同的事情的例子 – 解析一个Json字符串并返回一个Json属性的列表。
public ActionResult ReadJson() { string countiesJson = "{'Everything':[{'county_name':null,'description':null,'feat_class':'Civil','feature_id':'36865'," +"'fips_class':'H1','fips_county_cd':'1','full_county_name':null,'link_title':null,'url':'http://www.alachuacounty.us/','name':'Alachua County'"+ ",'primary_latitude':'29.7','primary_longitude':'-82.33','state_abbreviation':'FL','state_name':'Florida'},"+ "{'county_name':null,"+ "'feat_class':'Civil','feature_id':'36866','fips_class':'H1','fips_county_cd':'3','url':'http://www.bakercountyfl.org/','name':'Baker County','primary_latitude':'30.33','primary_longitude':'-82.29','state_name':'Florida'}]}"; //Can use either JSONParSEObject or JSONParseDynamic here List<string> counties = JSONParSEObject(countiesJson); JSONParseDynamic(countiesJson); return View(counties); } public List<string> JSONParSEObject(string jsonText) { JObject jResults = JObject.Parse(jsonText); List<string> counties = new List<string>(); foreach (var county in jResults["Everything"]) { counties.Add((string)county["name"]); } return counties; } public List<string> JSONParseDynamic(string jsonText) { dynamic jResults = JsonConvert.DeserializeObject(jsonText); List<string> counties = new List<string>(); foreach(var county in jResults.Everything) { counties.Add((string)county.name); } return counties; }
解决方法
存在LINQ到JSON API(JObject,JToken等)以允许使用JSON,而无需事先知道其结构。您可以使用JToken.Parse反序列化任意JSON,然后使用其他JToken方法检查和操作其内容。如果您只需要JSON中的一个或两个值(如县名),LINQ to JSON也可以正常工作。
另一方面,JsonConvert.DeserializeObject主要是为了在您提前了解JSON的结构并且要反序列化为强类型类时使用它们。例如,您将如何将JSON中的完整的县级数据从县域列表中列出。
class Program { static void Main(string[] args) { string countiesJson = "{'Everything':[{'county_name':null," +"'fips_class':'H1',"+ "{'county_name':null,'state_name':'Florida'}]}"; foreach (County c in JsonParseCounties(countiesJson)) { Console.WriteLine(string.Format("{0},{1} ({2},{3})",c.name,c.state_abbreviation,c.primary_latitude,c.primary_longitude)); } } public static List<County> JsonParseCounties(string jsonText) { return JsonConvert.DeserializeObject<RootObject>(jsonText).Counties; } } public class RootObject { [JsonProperty("Everything")] public List<County> Counties { get; set; } } public class County { public string county_name { get; set; } public string description { get; set; } public string feat_class { get; set; } public string feature_id { get; set; } public string fips_class { get; set; } public string fips_county_cd { get; set; } public string full_county_name { get; set; } public string link_title { get; set; } public string url { get; set; } public string name { get; set; } public string primary_latitude { get; set; } public string primary_longitude { get; set; } public string state_abbreviation { get; set; } public string state_name { get; set; } }
请注意,Json.Net使用给JsonConvert.DeserializeObject方法的类型参数来确定要创建的对象类型。
当然,如果您在调用DeserializeObject时没有指定类型,或者使用对象或动态方法,那么Json.Net不得不反序列化为JObject。 (你可以看到你的动态变量实际上是通过检查jResults.GetType()来获取JObject。FullName。)所以在这种情况下,JsonConvert.DeserializeObject和JToken.Parse之间没有什么区别。或者会给你一样的结果。