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.

Json.Net ignora los campos privados serializados en Unity.

Me gustaría ignorar los campos privados serializados en la serialización JSON, pero parece que <code>[JsonIgnore]</code> solo funciona con campos <code>public</code>, no funciona con campos <code>[SerializeField]</code> <code>private</code>. ¿Existe alguna otra forma de ignorar esos campos?

Este es un ejemplo de clase:

using UnityEngine;
using Newtonsoft.Json;

[JsonObject(MemberSerialization.OptIn)]
public class ObjetoEjemplo : MonoBehaviour {
    [JsonProperty]
    private string propiedad = "Propiedad";

    [JsonIgnore]
    [SerializeField]
    private string ignorado = "Ignorado";
}

Se sigue serializando el campo ignorado a JSON, a pesar de que estoy usando [JsonObject(MemberSerialization.OptIn)] en la clase y [JsonIgnore] en el campo private.

MemberSerialization.OptIn indica que:

“Solo se serializan los miembros marcados con JsonPropertyAttribute o System.Runtime.Serialization.DataMemberAttribute

, pero parece que también incluye los atributos SerializeField.

Editar: Estoy usando JilleJr Newtonsoft.Json-for-Unity (enlace de GitHub) con JilleJr Newtonsoft.Json-for-Unity.Converters (enlace de GitHub)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una opción podría ser crear un resolutor de contratos personalizado y anular el método CreateProperty para excluir los campos marcados con [SerializeField]. Aquí hay una implementación de ejemplo:

    using System.Reflection;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Serialization;
    
    public class IgnoreSerializeFieldContractResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);
            if (property != null && property.AttributeProvider.GetAttributes(typeof(SerializeField), true).Count > 0)
            {
                property.ShouldSerialize = instance => false;
            }
            return property;
        }
    }
    

    Luego, utiliza este resolutor de contratos al serializar tu objeto:

    var settings = new JsonSerializerSettings
    {
        ContractResolver = new IgnoreSerializeFieldContractResolver()
    };
    var json = JsonConvert.SerializeObject(exampleObject, Formatting.Indented, settings);
    

    Esto debería excluir cualquier campo marcado con [SerializeField] de ser serializado a JSON.

Comments are closed.