Was ist der Unterschied zwischen JsonConvert.DeserializeObject und JObject.Parse? Soweit ich das beurteilen kann, nehmen beide einen String und befinden sich in der Json.NET-Bibliothek. Welche Situation würde eine bequemer machen als die andere, oder ist es hauptsächlich nur eine Präferenz?
Als Referenz sehen Sie hier ein Beispiel, in dem ich beide verwende, um genau dasselbe zu tun: Analysieren Sie eine Json-Zeichenfolge und geben Sie eine Liste eines der Json-Attribute zurück.
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;
}
quelle
MissingMemberHandling
Einstellung gesteuert . Standardmäßig werden zusätzliche Eigenschaften ignoriert.JsonConvert.DeserializeObject hat einen Vorteil gegenüber JObject.Parse: Es ist möglich, benutzerdefinierte JsonSerializerSettings zu verwenden.
Dies kann sehr nützlich sein, z. B. wenn Sie steuern möchten, wie Daten deserialisiert werden. Standardmäßig werden Datumsangaben in DateTime-Objekte deserialisiert. Dies bedeutet, dass Sie möglicherweise ein Datum mit einer anderen Zeitzone als der in der JSON-Zeichenfolge haben.
Sie können dieses Verhalten ändern, indem Sie eine JsonSerializerSetting erstellen und DateParseHandling auf DateParseHandling.DateTimeOffset setzen.
Ein Beispiel:
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" }
quelle
Ich wusste, dass JsonConvert.DeserializeObject einen Array / List- Json-Text direkt deserialisieren kann, JObject jedoch nicht.
Versuchen Sie es mit dem folgenden Beispielcode:
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(); } } }
quelle
Abgesehen von den hier
Jobject.Parse
gegebenen Antworten zur Verwendung, die meiner Meinung nach korrekt sind: -> wenn der Json nicht stark typisiert ist oder Sie die Struktur von Json nicht im Voraus kennenJsonConvert.DeserializeObject<T>
-> Wenn Sie wissen, in welche Klasse oder welchen Typ der Json umgewandelt werden soll,T
kann dies eine komplexe Klasse oder ein einfacher Typ seinMeine Antwort basiert auf der Leistung für den Fall, dass die Struktur nicht bekannt ist, wie im OP-Code angegeben. Wenn wir die Verwendung beider Methoden für die Leistung vergleichen, wird festgestellt, dass die Leistung
Jobject.Parse()
in Bezug auf den zugewiesenen Speicher gut ist. Bitte ignorieren Sie den Namen Von den Methoden rufe ich zuerst die Methode mit 'JsonConvert.DeserializeObject' auf und dann die zweite Methode mitJobject.Parse
quelle