Estoy usando JSON.NET para serializar algunos de mis objetos, y me gustaría saber si hay una manera simple de reemplazar el convertidor json.net predeterminado solo para un objeto específico?Conversión personalizada de objetos específicos en JSON.NET
Actualmente tengo la clase siguiente:
public class ChannelContext : IDataContext
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<INewsItem> Items { get; set; }
}
JSON.NET serializa actualmente lo anterior como:
{
"Id": 2,
"Name": "name value",
"Items": [ item_data_here ]
}
¿Es posible sólo para esa clase específica para formatearlo la manera siguiente:
"Id_2":
{
"Name": "name value",
"Items": [ item data here ]
}
Soy un poco nuevo en JSON.NET .. Me preguntaba si lo anterior tiene algo que d o con la escritura de un convertidor personalizado. No pude encontrar ningún ejemplo concreto sobre cómo escribir uno. Si alguien puede indicarme una fuente específica, realmente lo agradeceré.
Necesito encontrar una solución que haga que esa clase específica siempre convierta la misma, porque el contexto anterior es parte de un contexto aún mayor que el convertidor predeterminado JSON.NET convierte muy bien.
espero que mi pregunta es lo suficientemente claro ...
ACTUALIZACIÓN:
he descubierto cómo crear un nuevo convertidor de medida (mediante la creación de una nueva clase que hereda de JsonConverter y anular es abstracta métodos), que overriden el método WriteJson de la siguiente manera:
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();
}
de hecho, esto hace el trabajo con éxito, pero ... me intriga si hay una manera de serializar el r Est de las propiedades del objeto mediante la reutilización del JsonSerializer predeterminado (o convertidor para el caso) en lugar de manualmente "Escribir" el objeto utilizando los métodos jsonwriter.
ACTUALIZACIÓN 2: que estoy tratando de conseguir una solución más genérica y se le ocurrió la siguiente:
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();
}
Esto funciona bien cuando se añade el convertidor de forma manual para el serializador, así:
jsonSerializer.Converters.Add(new AssociativeArraysConverter<DefaultFieldNameResolver>());
jsonSerializer.Serialize(writer, channelContextObj);
pero no funciona cuando se utiliza el [JsonConverter()] conjunto de atributos a mi costumbre Coverter encima de la clase ChannelContext debido a un bucle de referencia de auto que se produce cuando se ejecuta:
serializer.Serialize(writer, value)
Esto es obviamente porque mi convertidor de encargo se considera ahora el convertidor predeterminado para la clase una vez que se establece con el JsonConverterAttribute, por lo que obtener un bucle inifinite. Lo único que se me ocurre, para resolver este problema es heredar de una clase básica, jsonconverter, y llamar al método base.serialize() en su lugar ... ¿Pero existe una clase JsonConverter tal?
¡Muchas gracias!
Mikey
+1 para encontrar la solución. –