es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Serializar objeto solo a nivel raíz con NEWTONSOFT

Tengo clases como estas:

public abstract class EntityBase 
{

    public long Id { get; set; }

    public DateTimeOffset CreationTimeUtc { get; set; }
    public DateTimeOffset? ModificationTimeUtc { get; set; }

}

public class State : EntityBase 
{
    public string Name { get; set; }
    public IList<city> Cities { get; set; }
}

public class City : EntityBase 
{
    public string Name { get; set; }
    public State State { get; set; }
    public long StateId { get; set; }
}

Entonces, creo una variable de estado:

var state = new State()
        {
            Name = "State 1",
            CreationTimeUtc = DateTimeOffset.UtcNow,
            Id = Sequence.Generator.Next(),
            Cities = new List<city>()
            {
                new City()
                {
                    Id = Sequence.Generator.Next(),
                    CreationTimeUtc = DateTimeOffset.UtcNow,
                    Name = "City 1"
                }
            }
        };

Cuando serializo la variable de estado con NewTonSoft, devuelve una cadena como esta:

{"name":"State 1","cities":[{"name":"City 1","stateId":"265439108547260417","id":"265439108547260419","creationTimeUtc":1638876015097,"modificationTimeUtc":1638876015097}],"id":"265439108547260417","creationTimeUtc":1638876015097,"modificationTimeUtc":1638876015097}

Quiero crear solo el objeto raíz, en este caso necesito ignorar la propiedad Cities. No puedo usar el atributo [JsonIgnore] en la propiedad Cities. Quiero usar JsonSerializerSettings o algo similar para generar la cadena JSON.

Actualización

Utilizo este código para generar una cadena JSON:

var jsonSerializerSettings = new JsonSerializerSettings() { 
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
Newtonsoft.Json.JsonConvert.SerializeObject(state, jsonSerializerSettings);

¿Cómo puedo hacer eso?
Gracias

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para ignorar la propiedad Cities al serializar el objeto State utilizando JsonConvert.SerializeObject, puedes utilizar el atributo [JsonIgnore] en la propiedad Cities de la siguiente manera:

    public class State : EntityBase 
    {
        public string Name { get; set; }
    
        [JsonIgnore]
        public IList<city> Cities { get; set; }
    }
    

    Sin embargo, en este caso no puedes utilizar el atributo [JsonIgnore] en la propiedad Cities. En su lugar, puedes definir un ContractResolver personalizado que ignore la propiedad Cities durante la serialización.

    Aquí tienes un ejemplo de cómo puedes definir un ContractResolver personalizado:

    public class StateContractResolver : DefaultContractResolver
    {
        protected override List<memberinfo> GetSerializableMembers(Type objectType)
        {
            var members = base.GetSerializableMembers(objectType);
            members = members.Where(m => m.Name != "Cities").ToList();
            return members;
        }
    }
    

    Luego, puedes utilizar el método JsonConvert.SerializeObject con el ContractResolver personalizado de la siguiente manera:

    var jsonSerializerSettings = new JsonSerializerSettings { 
        ContractResolver = new StateContractResolver(),
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    };
    string json = JsonConvert.SerializeObject(state, jsonSerializerSettings);
    

    Esto generará una cadena JSON con solo las propiedades Name, Id, CreationTimeUtc y ModificationTimeUtc del objeto State. La propiedad Cities se ignorará durante la serialización.

Comments are closed.