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

c# - serialize - JSON.Net ignora la propiedad durante la deserialización



jsonproperty class name c# (4)

Esta es una solución coja pero puede hacer un método para cargar manualmente el json. Si hay demasiados datos para cargar sin un deserializador automático, simplemente elimine los nodos que no desea. Esto es mucho más lento sin embargo.

public static List<Foo> FromJson(string input) { var json = JToken.Parse(input); json["key"].Remove(); var foo = JsonConvert.DeserializeObject<List<Foo>>(json.ToString()); }

Este es un problema interesante. Me pregunto si alguien tiene una mejor solución para él.

Tengo una clase configurada de la siguiente manera:

public class Foo { public string string1 { get; set; } public string string2 { get; set; } public string string3 { get; set; } }

Estoy usando Json.Net para deserializar la siguiente respuesta de Json:

string json = "[{/"number1/": 1, /"number2/": 12345678901234567890, /"number3/": 3}, {/"number1/": 9, /"number2/": 12345678901234567890, /"number3/": 8}]";

Código de deserialización:

List<Foo> foos = JsonConvert.DeserializeObject<List<Foo>>(json);

El segundo número excede un int-64, pero realmente no me importa recuperar ese valor. ¿Hay alguna manera de convertir la propiedad ''number2'' en una cadena, o ignorarla por completo durante la deserialización?

He intentado agregar el atributo ''[JsonConverter (typeof (string))] a la propiedad de string2, pero recibo el error:'' Error al crear System.String ''. También he intentado configurar typeof (decimal).

También he intentado usar [JsonIgnore] pero eso no funciona.


Aquí está la forma preferida de Newtonsoft Json de ignorar una propiedad sin tener que modificar la clase según http://james.newtonking.com/json/help/index.html?topic=html/ReducingSerializedJSONSize.htm

Este se usa para ignorar las propiedades de referencia perezosas de EF o Linq2Sql

public class DynamicContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { Func<Type,bool> includeProperty = t => t.IsValueType || t.Namespace.StartsWith("System") && t.Namespace.StartsWith("System.Data")==false; IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization); var allProperties = properties.Select (p => new{p.PropertyName,Including=includeProperty(p.PropertyType), p.PropertyType});//.Dump("props"); var warnProperties=allProperties.Where (a =>a.Including && a.PropertyType.IsValueType==false && a.PropertyType.Name.IsIgnoreCaseMatch("String")==false) ; //linq pad debugging helper //var propertyTypesSerializing= allProperties.Where (p => p.Including).Select (p => p.PropertyType).Distinct().OrderBy (p => p.Name).Dump(); if(warnProperties.Any()) { //LinqPad helper //Util.Highlight(warnProperties.ToArray()).Dump("warning flag raised, aborting"); throw new ArgumentOutOfRangeException(); } properties = properties.Where(p =>includeProperty(p.PropertyType)).ToList(); return properties; } }

Todas las llamadas .Dump() son solo asistentes de depuración de linqpad, llamadas de método no necesarias.

uso de muestra:

var inactives = from am in Aspnet_Memberships join mm in Member_members on am.UserId equals mm.Member_guid where mm.Is_active==false && mm.Org_id==1 select new{am,mm}; //inactives.Take(4).ToArray().Dump(); var serialized = JsonConvert.SerializeObject( inactives.Skip(1).Select(i => i.mm).First(), new JsonSerializerSettings() { ContractResolver = new DynamicContractResolver(), PreserveReferencesHandling = PreserveReferencesHandling.None, ReferenceLoopHandling= ReferenceLoopHandling.Ignore }); //.Dump();


Similar a la solución de @ Maslow , puede usar otro "ignorante" de propósito general :

var jsonResolver = new IgnorableSerializerContractResolver(); // ignore your specific property jsonResolver.Ignore(typeof(Foo), "string2"); // ignore single datatype jsonResolver.Ignore(typeof(System.Data.Objects.DataClasses.EntityObject)); var jsonSettings = new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, ContractResolver = jsonResolver };


Puede usar la propiedad MissingMemberHandling del objeto JsonSerializerSettings .

Ejemplo de uso:

var jsonSerializerSettings = new JsonSerializerSettings(); jsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore; JsonConvert.DeserializeObject<YourClass>(jsonResponse, jsonSerializerSettings);

Más información aquí .