serializeobject property newtonsoft name jsonserializersettings jsonproperty jsonconvert c# json.net

newtonsoft - jsonproperty class name c#



JSON.NET deserializa una propiedad especĂ­fica (6)

Tengo el siguiente texto JSON :

{ "PropOne": { "Text": "Data" } "PropTwo": "Data2" }

Quiero deserializar PropOne en el tipo PropOneClass sin la sobrecarga de deserializar cualquier otra propiedad en el objeto. ¿Se puede hacer esto usando JSON.NET?


El JSON no es demasiado grande, así que tomaré la sugerencia de Matt Johnson y deserializaré todo el asunto. Gracias a la respuesta de jcwrequests, pude usar este método:

var jObject = JObject.Parse(json); var jToken = jObject.GetValue("PropTwo"); PropTwoClass value = jToken.ToObject(typeof(PropTwoClass));


Una solución más simple a la respuesta de Omar sería tener una envoltura.

class Wrapper { public PropOneClass PropOne; } JsonConvert.Deserialize<Wrapper>(json).PropOne

Mis pruebas encontraron que era aproximadamente un 30% más rápido.


Use JsonIgnore : esto hará que la propiedad sea ignorada por completo por Json.Net, tanto para la serialización como para la deserialización.

Además, revisa este link .


La respuesta de Matt es, con mucho, la solución más rápida, aunque tiene un error. Este es mi intento de arreglar eso. Este método solo devolverá una propiedad coincidente en el nivel raíz. Todavía hay un enfoque ingenuo en el conteo de tokens de inicio y fin, aunque para JSON válido probablemente funcionará.

Matt, siéntete libre de copiar esto en tu respuesta.

public T GetFirstInstance<T>(string propertyName, string json) { using (var stringReader = new StringReader(json)) using (var jsonReader = new JsonTextReader(stringReader)) { int level = 0; while (jsonReader.Read()) { switch (jsonReader.TokenType) { case JsonToken.PropertyName: if (level != 1) break; if ((string)jsonReader.Value == propertyName) { jsonReader.Read(); return (T)jsonReader.Value; } break; case JsonToken.StartArray: case JsonToken.StartConstructor: case JsonToken.StartObject: level++; break; case JsonToken.EndArray: case JsonToken.EndConstructor: case JsonToken.EndObject: level--; break; } } return default(T); } }


public T GetFirstInstance<T>(string propertyName, string json) { using (var stringReader = new StringReader(json)) using (var jsonReader = new JsonTextReader(stringReader)) { while (jsonReader.Read()) { if (jsonReader.TokenType == JsonToken.PropertyName && (string)jsonReader.Value == propertyName) { jsonReader.Read(); var serializer = new JsonSerializer(); return serializer.Deserialize<T>(jsonReader); } } return default(T); } } public class MyType { public string Text { get; set; } } public void Test() { string json = "{ /"PropOne/": { /"Text/": /"Data/" }, /"PropTwo/": /"Data2/" }"; MyType myType = GetFirstInstance<MyType>("PropOne", json); Debug.WriteLine(myType.Text); // "Data" }

Este enfoque evita tener que deserializar todo el objeto. Pero tenga en cuenta que esto solo mejorará el rendimiento si el json es significativamente grande y la propiedad que está deserializando es relativamente temprana en los datos. De lo contrario, solo debes deserializar todo el contenido y extraer las partes que desees, como muestra la respuesta de jcwrequests.


var json = "{ "PropOne": { "Text": "Data" } "PropTwo": "Data2" }"; JObject o = JObject.Parse(json); var val = o.PropTwo;

Al usar el proveedor JSON Linq, no es necesario deserializar el objeto en un tipo conocido.