Я использую JSON.NET для сериализации некоторых своих объектов, и я хотел бы знать, есть ли простой способ переопределить конвертер json.net по умолчанию только для определенного объекта?
В настоящее время у меня есть следующий класс:
public class ChannelContext : IDataContext
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<INewsItem> Items { get; set; }
}
JSON.NET в настоящее время сериализует вышеперечисленное, например:
{
"Id": 2,
"Name": "name value",
"Items": [ item_data_here ]
}
Возможно ли для этого конкретного класса вместо этого отформатировать его таким образом:
"Id_2":
{
"Name": "name value",
"Items": [ item data here ]
}
Я новичок в JSON.NET ... Мне было интересно, связано ли это с написанием пользовательского конвертера.Я не смог найти никаких конкретных примеров того, как написать один. Если кто-то может указать мне на конкретный источник, я буду очень признателен.
Мне нужно найти решение, которое делает этот конкретныйкласс всегда конвертирует одно и то же, потому что приведенный выше контекст является частью еще большего контекста, который конвертер JSON.NET по умолчанию преобразует просто отлично.
Надеюсь, мой вопрос достаточно ясен ...
ОБНОВЛЕНИЕ:
Я нашел, как создать новый пользовательский конвертер (создав новый класс, который наследует от JsonConverter и переопределил его абстрактные методы), я переопределил метод WriteJson следующим образом:
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();
}
Это действительно делает работу успешно, но ... Я заинтригован, если есть способ сериализации остальных свойств объекта путем повторного использования JsonSerializer по умолчанию (или, в этом отношении, конвертера) вместо"запись" объекта вручную с помощью методов jsonwriter.
ОБНОВЛЕНИЕ 2: Я пытаюсь получить более общее решение и сВспомните следующее:
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();
}
Это прекрасно работает при добавлении конвертера вручную в сериализатор, например так:
jsonSerializer.Converters.Add(new AssociativeArraysConverter<DefaultFieldNameResolver>());
jsonSerializer.Serialize(writer, channelContextObj);
Но не работает при использовании [JsonConverter ()] атрибут установлен на мой пользовательский покрыватель над классом ChannelContext из-за цикла самоссылки, который происходит при выполнении:
serializer.Serialize(writer, value)
Это очевидно, потому что мой пользовательский конвертер теперь считается конвертером по умолчанию для класса, как только онустанавливается с помощью атрибута JsonConverterAttribute, поэтому я получаю бесконечный цикл.Единственное, о чем я могу думать, чтобы решить эту проблему, это унаследовать от базового класса jsonconverter и вместо этого вызвать метод base.serialize () ... Но существует ли такой класс JsonConverter?
Большое спасибо!
Мики