serializeobject serialize serializar newtonsoft net jsonconvert example deserialize c# json.net jsonserializer

c# - serializar - newtonsoft json serialize vb net



JObject.Parse vs JsonConvert.DeserializeObject (2)

JsonConvert.DeserializeObject tiene una ventaja sobre JObject.Parse: es posible usar JsonSerializerSettings personalizados.

Esto puede ser muy útil, por ejemplo, si desea controlar cómo se deserializan las fechas. Por defecto, las fechas se deserializan en objetos DateTime. Esto significa que puede terminar con una fecha con otra zona horaria que la de la cadena json.

Puede cambiar este comportamiento creando un JsonSerializerSetting y configurando DateParseHandling para DateParseHandling.DateTimeOffset.

Un ejemplo:

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" }

¿Cuál es la diferencia entre JsonConvert.DeserializeObject y JObject.Parse? Por lo que puedo decir, ambos toman una cadena y están en la biblioteca Json.NET. ¿Qué tipo de situación lo haría uno más conveniente que el otro, o es principalmente solo una preferencia?

Como referencia, aquí hay un ejemplo de mí que usa ambos para hacer exactamente lo mismo: analizar una cadena Json y devolver una lista de uno de los atributos 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; }


La API LINQ-to-JSON ( JObject , JToken , etc.) existe para permitir trabajar con JSON sin necesidad de conocer su estructura con anticipación. Puede deserializar cualquier JSON arbitrario usando JToken.Parse , luego examinar y manipular su contenido utilizando otros métodos JToken . LINQ-to-JSON también funciona bien si solo necesita uno o dos valores del JSON (como el nombre de un condado).

JsonConvert.DeserializeObject , por otro lado, está destinado principalmente a ser utilizado cuando SÍ conoces la estructura de JSON con anticipación y quieres deserializar en clases fuertemente tipadas. Por ejemplo, así es como obtendría el conjunto completo de datos del condado de su JSON en una lista de objetos del 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; } }

Observe que Json.Net utiliza el argumento de tipo dado al método JsonConvert.DeserializeObject para determinar qué tipo de objeto crear.

Por supuesto, si no especifica un tipo cuando llama a DeserializeObject , o usa object o dynamic , entonces Json.Net no tiene más remedio que deserializar en un JObject . (Puede ver por sí mismo que su variable dinámica realmente contiene un JObject al marcar jResults.GetType().FullName ). Entonces, en ese caso, no hay mucha diferencia entre JsonConvert.DeserializeObject y JToken.Parse ; cualquiera le dará el mismo resultado.