Jaka jest różnica między JsonConvert.DeserializeObject i JObject.Parse? O ile wiem, oba pobierają ciąg i znajdują się w bibliotece Json.NET. Jaka sytuacja sprawiłaby, że jedna byłaby wygodniejsza od drugiej, czy jest to głównie preferencja?
Dla porównania, oto przykład, w którym używam obu, aby zrobić dokładnie to samo - przeanalizować ciąg Json i zwrócić listę jednego z atrybutów 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;
}
źródło
MissingMemberHandling
ustawienie. Domyślnie ignorowane są dodatkowe właściwości.JsonConvert.DeserializeObject ma jedną przewagę nad JObject.Parse: możliwe jest użycie niestandardowego JsonSerializerSettings.
Może to być bardzo przydatne, np. Jeśli chcesz kontrolować sposób deserializacji dat. Domyślnie daty są deserializowane do obiektów DateTime. Oznacza to, że możesz skończyć z datą z inną strefą czasową niż ta w ciągu json.
Możesz zmienić to zachowanie, tworząc JsonSerializerSetting i ustawiając DateParseHandling na DateParseHandling.DateTimeOffset.
Przykład:
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" }
źródło
Znałem zaletę, że JsonConvert.DeserializeObject może bezpośrednio deserializować tekst json Array / List , ale JObject nie może.
Wypróbuj poniższy przykładowy kod:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; namespace NetCoreJsonNETDemo { internal class Person { [JsonProperty] internal string Name { get; set; } [JsonProperty] internal int? Age { get; set; } } internal class PersonContainer { public List<Person> Persons { get; set; } } class Program { static T RecoverPersonsWithJsonConvert<T>(string json) { return JsonConvert.DeserializeObject<T>(json); } static T RecoverPersonsWithJObejct<T>(string json) where T : class { try { return JObject.Parse(json).ToObject<T>(); } catch (Exception ex) { Console.WriteLine("JObject threw an Exception: " + ex.Message); return null; } } static void Main(string[] args) { List<Person> persons = new List<Person>(); persons.Add(new Person() { Name = "Jack", Age = 18 }); persons.Add(new Person() { Name = "Sam", Age = null }); persons.Add(new Person() { Name = "Bob", Age = 36 }); string json = JsonConvert.SerializeObject(persons, new JsonSerializerSettings() { Formatting = Formatting.Indented }); List<Person> newPersons = RecoverPersonsWithJsonConvert<List<Person>>(json); newPersons = RecoverPersonsWithJObejct<List<Person>>(json);//JObject will throw an error, since the json text is an array. PersonContainer personContainer = new PersonContainer() { Persons = persons }; json = JsonConvert.SerializeObject(personContainer, new JsonSerializerSettings() { Formatting = Formatting.Indented }); newPersons = RecoverPersonsWithJObejct<PersonContainer>(json).Persons; newPersons = null; newPersons = RecoverPersonsWithJsonConvert<PersonContainer>(json).Persons; Console.WriteLine("Press any key to end..."); Console.ReadKey(); } } }
źródło
Oprócz odpowiedzi udzielonych tutaj na temat użytkowania, które są poprawne według mnie:
Jobject.Parse
-> gdy Json nie jest silnie wpisany lub nie znasz struktury Json z wyprzedzeniemJsonConvert.DeserializeObject<T>
-> Kiedy wiesz, w której klasie lub typie rzutować Json.T
Może to być klasa złożona lub typ prostyMoja odpowiedź opiera się na wydajności w przypadku, gdy struktura nie jest znana, jak podano w kodzie OP, jeśli porównamy użycie obu metod dla wydajności, zauważam, że
Jobject.Parse()
wypada dobrze pod względem przydzielonej pamięci, zignoruj nazwę metod, najpierw wywołuję metodę z `` JsonConvert.DeserializeObject '', a następnie drugą metodą jestJobject.Parse
źródło