LINQ 到 JSON API (JObject
, JToken
等)的存在是为了允许使用 JSON,而无需提前知道其结构。您可以使用反序列化任何任意 JSONJToken.Parse
,然后使用其他方法检查和操作其内容JToken
方法。如果您只需要 JSON 中的一两个值(例如县名),LINQ-to-JSON 也能很好地工作。
JsonConvert.DeserializeObject
另一方面,主要用于当您提前知道 JSON 的结构并且想要反序列化为强类型类时。例如,以下是如何将完整的县数据集从 JSON 获取到列表中的方法County
对象。
class Program
{
static void Main(string[] args)
{
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,'description':null,"+ "'feat_class':'Civil','feature_id':'36866','fips_class':'H1','fips_county_cd':'3','full_county_name':null,'link_title':null,'url':'http://www.bakercountyfl.org/','name':'Baker County','primary_latitude':'30.33','primary_longitude':'-82.29','state_abbreviation':'FL','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
,或者你使用object
or dynamic
,那么 Json.Net 就别无选择,只能反序列化为JObject
。 (您可以亲眼看到您的动态变量实际上包含一个JObject
通过检查jResults.GetType().FullName
.)所以在这种情况下,两者之间没有太大区别JsonConvert.DeserializeObject
and JToken.Parse
;两者都会给你相同的结果。