Создание экземпляра.Разбор против JsonConvert.DeserializeObject
в чем разница между JsonConvert.DeserializeObject и JObject.Разбирать? Насколько я могу судить, оба берут строку и находятся в 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;
}
2 ответов:
API LINQ-to-JSON (
JObject,JTokenи т. д.) существует, чтобы позволить работать с JSON без необходимости знать его структуру заранее. Вы можете десериализовать любой произвольный JSON с помощьюJToken.Parse, затем изучить и манипулировать его содержание с помощью другихJTokenметоды. LINQ-to-JSON также хорошо работает, если вам просто нужно одно или два значения из 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илиdynamic, тогда Json.Net у меня нет выбора, кроме как ... десериализовать вJObject. (Вы можете сами убедиться, что ваша динамическая переменная на самом деле содержитJObjectпри проверкеjResults.GetType().FullName.) Так что в этом случае нет большой разницы междуJsonConvert.DeserializeObjectиJToken.Parse; либо даст вам тот же результат.
JsonConvert.DeserializeObject имеет одно преимущество перед JObject.Разбор: Можно использовать пользовательские 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" }
Comments