La coutume de conversion des objets spécifiques dans JSON.NET

Je suis en utilisant JSON.NET pour sérialiser certains de mes objets, et j'aimerais savoir si il existe un moyen simple de remplacer la valeur par défaut json.net convertisseur seulement pour un objet spécifique?

Actuellement, j'ai la classe suivante:

public class ChannelContext : IDataContext
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<INewsItem> Items { get; set; }
}

JSON.NET actuellement sérialise le dessus comme:

{
    "Id": 2,
    "Name": "name value",
    "Items": [ item_data_here ]
}

Est-il possible juste pour cette classe spécifique pour le format de cette façon au lieu de cela:

"Id_2":
{
    "Name": "name value",
    "Items": [ item data here ]
}

Je suis un peu nouveau pour JSON.NET.. je me demandais si ce qui précède a quelque chose à voir avec la rédaction d'un convertisseur personnalisé. Je n'étais pas en mesure de trouver des exemples concrets sur la façon d'écrire une, Si quelqu'un peut me pointer à une source spécifique, je vais vraiment l'apprécier.

J'ai besoin de trouver une solution, ce qui rend cette classe spécifique convertissez toujours la même, parce que le contexte ci-dessus est une partie d'un même contexte plus large qui l'JSON.NET par défaut convertisseur convertit l'amende juste.

Espère que ma question est assez claire...

Mise à JOUR:

J'ai trouvé comment créer un nouveau convertisseur personnalisé (par la création d'une nouvelle classe qui hérite de JsonConverter et de la remplacer de méthodes abstraites), j'ai remplacé le WriteJson méthode comme suit:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ChannelContext contextObj = value as ChannelContext;

        writer.WriteStartObject();
        writer.WritePropertyName("id_" + contextObj.Id);
        writer.WriteStartObject();
        writer.WritePropertyName("Name");
        serializer.Serialize(writer, contextObj.Name);

        writer.WritePropertyName("Items");
        serializer.Serialize(writer, contextObj.Items);
        writer.WriteEndObject();
        writer.WriteEndObject();
    }

Ce, en effet, que le travail avec succès, mais...
Je me demande si il existe un moyen de sérialiser le reste des propriétés de l'objet par la réutilisation de la valeur par défaut JsonSerializer (ou convertisseur d'ailleurs) au lieu de saisir manuellement "l'Écriture" de l'objet à l'aide de la jsonwriter méthodes.

Mise à JOUR 2:
Je vais essayer d'obtenir un plus solution générique et est venu avec les éléments suivants:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteStartObject();

        //Write associative array field name
        writer.WritePropertyName(m_FieldNameResolver.ResolveFieldName(value));

        //Remove this converter from serializer converters collection
        serializer.Converters.Remove(this);

        //Serialize the object data using the rest of the converters
        serializer.Serialize(writer, value);

        writer.WriteEndObject();
    }

Cela fonctionne bien lors de l'ajout de l'converter manuellement pour le sérialiseur, comme ceci:

jsonSerializer.Converters.Add(new AssociativeArraysConverter<DefaultFieldNameResolver>());
jsonSerializer.Serialize(writer, channelContextObj);

Mais ne fonctionne pas lors de l'utilisation de la [JsonConverter()] attribut défini pour mon custom coverter au-dessus de la ChannelContext la classe à cause d'un soi boucle de référence qui se produit lors de l'exécution:

serializer.Serialize(writer, value)

C'est évidemment parce que mon convertisseur personnalisé est maintenant considéré comme la valeur par défaut du convertisseur pour la classe une fois qu'il est réglé par le JsonConverterAttribute, si je reçois un inifinite boucle.
La seule chose à laquelle je pense, dans le but de résoudre ce problème est d'hériter de base, jsonconverter de classe, et l'appel de la base.méthode de serialize() à la place...
Mais ce JsonConverter classe existe encore?

Merci beaucoup!

Mikey

  • +1 pour trouver la solution.
InformationsquelleAutor Mikey S. | 2011-06-19