2 votes

Convertir en Json un objet qui hérite d'un dictionnaire

J'ai la définition de classe suivante :

public class ElasticObject : Dictionary
{
    public int Id { get;set;}
}

var keyValues = new ElasticObject();
keyValues.Id= 200000;
keyValues.Add("Price", 12.5);
var json = JsonConvert.SerializeObject(keyValues,
           new JsonSerializerSettings{NullValueHandling = NullValueHandling.Ignore});

La chaîne json analysée est {"Price":12.5} qui ne parvient pas à contenir la propriété Id, y a-t-il un moyen de personnaliser la conversion json ?

2voto

Brian Rogers Points 12160

Vous pouvez le faire en créant une classe JsonConverter personnalisée. Peut-être quelque chose comme ceci :

class ElasticObjectConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(ElasticObject));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ElasticObject eobj = (ElasticObject)value;
        var temp = new Dictionary(eobj);
        temp.Add("Id", eobj.Id);
        serializer.Serialize(writer, temp);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var temp = serializer.Deserialize>(reader);
        ElasticObject eobj = new ElasticObject();
        foreach (string key in temp.Keys)
        {
            if (key == "Id")
                eobj.Id = Convert.ToInt32(temp[key]);
            else
                eobj.Add(key, temp[key]);
        }
        return eobj;
    }
}

Vous l'utiliseriez ensuite comme ceci :

var settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    Converters = new List { new ElasticObjectConverter() }
};

var keyValues = new ElasticObject();
keyValues.Id = 200000;
keyValues.Add("Price", 12.5);

var json = JsonConvert.SerializeObject(keyValues, settings);

Le JSON produit par le code ci-dessus ressemblerait à ceci :

{"Price":12.5,"Id":200000}

Est-ce ce que vous recherchez?

0voto

Eddie Loeffen Points 341

J'ai simplement ajouté les propriétés supplémentaires en renvoyant les données dans le dictionnaire de base. De cette façon, vous pouvez exposer une propriété comme "Id", mais lors de la sérialisation/désérialisation, cela fonctionnera simplement avec le dictionnaire sous-jacent:

public class ElasticObject : Dictionary
{
    public int Id
    {
        get { 
            int val;
            if (int.TryParse(this["Id"] as string, out val))
            {
                return val;
            }

            return -1;
        }
        set { this["Id"] = value; }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X