La sérialisation de la valeur null dans JSON.NET

Lors de la sérialisation de données arbitraires via JSON.NET toute la propriété est null est écrit dans le JSON comme

"propertyName" : null

C'est correct, bien sûr.

Toutefois, j'ai une exigence de traduire automatiquement toutes les valeurs null dans le vide par défaut de la valeur, par exemple, null strings devrait devenir String.Empty, null int?s devrait devenir 0, null bool?s doit être false, et ainsi de suite.

NullValueHandling n'est pas utile, étant donné que je ne veux pas Ignore les valeurs null, mais pas plus que je ne veux Include eux (Hmm, nouvelle fonctionnalité?).

Donc je me suis tourné vers la mise en œuvre d'une coutume JsonConverter.

Alors que la mise en œuvre elle-même était un jeu d'enfant, malheureusement cela na pas encore de travail - CanConvert() n'est jamais appelé pour un bien qui a une valeur nulle, et donc WriteJson() n'est pas appelé. Apparemment, les valeurs null sont automatiquement sérialisé directement dans null, sans le pipeline personnalisé.

Par exemple, voici un exemple d'un convertisseur personnalisé pour des chaînes vides:

public class StringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(string).IsAssignableFrom(objectType);
    }

    ...
    public override void WriteJson(JsonWriter writer, 
                object value, 
                JsonSerializer serializer)
    {
        string strValue = value as string;

        if (strValue == null)
        {
            writer.WriteValue(String.Empty);
        }
        else
        {
            writer.WriteValue(strValue);
        }
    }
}

Pas à pas dans cette, dans le débogueur, j'ai constaté qu'aucune de ces méthodes sont appelées pour les propriétés qui ont une valeur null.

De plonger dans la JSON.NET s'code source, j'ai trouvé que (apparemment, je n'ai pas aller dans beaucoup de profondeur) il existe un cas particulier de la vérification pour les valeurs null, et explicitement appel .WriteNull().

Pour ce que ça vaut, j'ai essayé de mettre en œuvre une coutume JsonTextWriter et en remplaçant la valeur par défaut .WriteNull() mise en œuvre...

public class NullJsonWriter : JsonTextWriter
{
    ... 
    public override void WriteNull()
    {
        this.WriteValue(String.Empty);
    }
}

Cependant, cela ne peut pas bien fonctionner, puisque la WriteNull() méthode ne sait rien sur le type de données sous-jacente. Alors bien sûr, je peux sortie "" pour toute nulle, mais qui ne fonctionne pas bien, par exemple de type int, bool, etc.

Donc, ma question de la conversion de l'ensemble de la structure de données manuellement, est-il une solution pour cela?

  • J'imagine que l' WriteNull() méthode est appelée en interne dans le processus de sérialisation JSON et vous ne pouvez pas déterminer la valeur que vous sont actuellement à la sérialisation?
  • Le WriteNull méthode est appelée par la JsonSerializer lorsque le bien a une valeur null. Pour être précis, la valeur, je suis la sérialisation est toujours nulle :), mais oui, il semble y avoir aucun moyen de connaître le type de données pour lequel la valeur null est en cours d'écriture.
  • Quel est le point de l'utilisation de types nullables si vous allez juste pour ignorer la valeur null comme un état valide de l'objet?
  • bonne question, mais dans ce cas, les types nullables sont utilisé côté serveur (par exemple, dans le modèle), mais le client/destinataire/point de vue n'est pas de gérer la valeur null état très bien (oui, je préférerais avoir le client fixe, mais sa dans une situation compliquée). En tout cas, juste parce que je commence avec des types nullables, ne devrais pas dire qu'il ne peut pas être sérialisé en quelque chose d'autre...
  • Est-il possible de remplacer l'un de l'WriteValue(Nullable<T>) pour votre cas où vous souhaitez que la valeur par défaut pour ce type de? Est la méthode appelée comme pour un int? est WriteValue(Nullable<int>) appelé ou est-il directement des flux de WriteNull()? JsonTextWriter
  • Après coup d'oeil sur le code source de Json.Net je ne pense pas que vous pouvez le faire facilement sans modifier son code source.
  • if(value==null) est à peu près le premier cas 🙁
  • Gosh je souhaite qu'il y avait un moyen de les sérialiser NULL lorsque l'un JsonConverterAttribute a été spécifié sur une propriété. J'ai particulièrement besoin de modifier la sortie de quelque chose d'autre que "null" sur nullable propriétés dans mon cas aussi. Nous pouvons peut-être obtenir une demande de fonctionnalité pour ce.
  • json.codeplex.com/workitem/22508

InformationsquelleAutor AviD | 2012-01-12