Question

J'ai migré une méthode API d'une action MVC standard vers la nouvelle version bêta de l'API Web asp.net et soudainement une propriété en lecture seule n'est plus sérialisée (les deux retournant JSON).Ce comportement est-il attendu?

Modifier: exemple de code ajouté

J'ai à la fois Newtonsoft.Json 4.0.8 et System.Json 4.0 référencés via des packages nuget

        public IQueryable<Car> Gets()
        {
             return _carRepository.GetCars();
        }

        public class Car
        {
            public IEnumerable<Photo> Photos
            {
                get { return _photos; }
            }

            public string PreviewImageUrl // No longer serialized
            {
                get
                {
                     var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault();
                        return mainImage != null ? mainImage.Url : (string.Empty);
                    }
                }
             }
         }
Était-ce utile?

La solution

Le JsonMediaTypeFormatter fourni avec la bêta utilise un sérialiseur qui ne prend pas en charge les propriétés en lecture seule (car elles ne feraient pas un aller-retour correctement).Nous prévoyons de résoudre ce problème pour la prochaine version.

En attendant, vous pouvez utiliser une implémentation JSON MediaTypeFormatter personnalisée qui utilise Json.NET (il y en a une disponible here ) au lieu du formateur intégré.

Mise à jour: Consultez également le blog d'Henrik sur le raccordement d'un formateur JSON.NET: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-avec-asp-net-web-api.aspx

Autres conseils

Je ne sais pas si c'est un comportement attendu ou non.Je dirais que cela est attendu pour les paramètres d'entrée (car vous ne pouvez pas définir leurs valeurs) mais pas pour les paramètres de sortie.Donc je dirais que c'est un bug pour un paramètre de sortie.Et voici un exemple illustrant le problème:

Modèle:

public class Product
{
    public Product()
    {
        Prop1 = "prop1 value";
        Prop2 = "prop2 value";
        Prop3 = "prop3 value";
    }

    public string Prop1 { get; set; }

    [ReadOnly(true)]
    public string Prop2 { get; set; }

    public string Prop3 { get; protected set; }
}

Contrôleur:

public class ProductsController : ApiController
{
    public Product Get(int id)
    {
        return new Product();
    }
}

Demande:

api/products/5

Résultat:

{"Prop1":"prop1 value","Prop2":"prop2 value"}

Donc, si la propriété n'a pas de setter public, elle n'est pas sérialisée, ce qui ne semble pas normal car la classe Product est utilisée comme sortie dans ce cas.

Je suggérerais d'ouvrir un ticket de connexion afin que Microsoft puisse résoudre ce problème avant la sortie ou au moins dire que c'est par conception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top