JObject.Parse与JsonConvert.DeserializeObject
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,'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'}]}";
//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
主要用于在您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
方法的type参数来确定要创建的对象类型。
当然,如果您在调用DeserializeObject
时未指定类型,或者使用object
或dynamic
,则Json.Net别无选择,只能反序列化为JObject
。 (你可以亲眼看到你的动态变量实际上通过检查jResults.GetType().FullName
。)来保存JObject
。)所以在这种情况下, JsonConvert.DeserializeObject
和JToken.Parse
之间没有太大的区别; 要么会给你相同的结果。
JsonConvert.DeserializeObject与JObject.Parse相比有一个优点:可以使用自定义的JsonSerializerSettings。
这可以是非常有用的,例如,如果你想控制日期如何反序列化。 默认情况下,日期被反序列化为DateTime对象。 这意味着你可能会得到另一个时区的日期,而不是json字符串中的日期。
您可以通过创建JsonSerializerSetting并将DateParseHandling设置为DateParseHandling.DateTimeOffset来更改此行为。
一个例子:
var json = @"{ ""Time"": ""2015-10-28T14:05:22.0091621+00:00""}";
Console.WriteLine(json);
// Result: { "Time": "2015-10-28T14:05:22.0091621+00:00" }
var jObject1 = JObject.Parse(json);
Console.WriteLine(jObject1.ToString());
// Result: { "Time": "2015-10-28T15:05:22.0091621+01:00" }
var jObject2 = Newtonsoft.Json.JsonConvert.DeserializeObject(json,
new Newtonsoft.Json.JsonSerializerSettings
{
DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset
});
Console.WriteLine(jObject2.ToString());
// Result: { "Time": "2015-10-28T14:05:22.0091621+00:00" }
链接地址: http://www.djcxy.com/p/37847.html
上一篇: JObject.Parse vs JsonConvert.DeserializeObject
下一篇: Writing JSON schema to detect objects with duplicate names