Использование Json.net - частичная пользовательская сериализация объекта С#
Я использую Json.Net Newtonsofts для сериализации некоторых и массива объектов для json.
Объекты имеют общий набор свойств, но также имеют свойство Meta, которое является словарем
Во время сериализации я хочу, чтобы пары значений ключа добавлялись к моему объекту json, как если бы они имели свойства уровня корня, как это...
{
id: 1,
name:'jeff',
food:'spinch',
spoon: 'ýes'
}
Не так:
{
id: 1,
name:'jeff',
meta:{
food:'spinch',
spoon: 'ýes'
}
}
Я вырыл через JsonSerializerSettings, но наклоняю, кажется, обнаруживаю, где я могу прыгать и переопределять???
Ответы
Ответ 1
Вы можете сделать это, создав свой собственный JsonConverter
, а затем добавив атрибут к классу, который вы хотите сериализовать
[JsonConverter(typeof(MyConverter))]
Пример здесь -
http://www.lostechies.com/blogs/rhouston/archive/2008/02/25/a-custom-converter-for-json-net.aspx
Ответ 2
Если ваш словарь является string
to object
, словарь может просто использовать атрибут [JsonExtensionData]
:
[JsonExtensionData]
public Dictionary<string, object> Meta { get; set; }
Смотрите Как сериализовать словарь как часть его родительского объекта с помощью Json.Net.
Ответ 3
Вы можете использовать .Net DataContractJsonSerializer.
Для пользовательской сериализации см.
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx
Одним из преимуществ использования IDataContractSurrogate
(по сравнению с просто добавлением свойств для вашего класса для сериализации) является то, что вам не нужно смешивать фактические свойства и свойства сериализации вместе в одном классе.
Еще одно преимущество (по сравнению с необходимостью делать пользовательскую сериализацию с мешком свойств ala KeyValuePairConverter) заключается в том, что вам нужно добавлять атрибуты к свойствам на ваших классах (фактический тип и суррогатный тип), и вы можете написать весь код конверсии/пользовательского кода сериализации непосредственно против этих типов. Это держит ваш код на более высоком уровне и позволяет структуре работать с точным механизмом транспорта.