Я только что столкнулся с подобной проблемой, в данном случае это свойство пользовательского объекта в модели Linq to SQL, которое я бы предпочел просто сериализовать в базу данных и из нее, а не настраивать множество дополнительных поля и дополнительные конструкторы. Я не уверен, насколько это соответствует вашей ситуации, но это должно быть адаптировано.
В большинстве решений, которые я видел, требовалось включить либо атрибуты (что невозможно из-за автоматической генерации кода), либо преобразование пользовательских преобразователей (излишнее, особенно если вы хотите захватить вложенные объекты и т. Д.).
Я думаю, что все свойства, которые мне не нужны, уже имеют атрибуты из-за LinqToSql, поэтому вместо того, чтобы вручную получать свойства, которые я хочу, затем пытаться их сериализовать, сначала Serialize, а затем DeSerialize. Это дает вам ваш объектный граф, с которым намного проще работать, и все ваши вложения были сделаны для вас.
Затем получите имена членов, которые нам не нужны. Как вы получите это, зависит только от вас, может даже случиться дать ему имена вручную так же, как вы исключили бы из привязки модели в MVC. В моем случае немного Linq и немного размышлений дает нам имена всех свойств, которые генерирует Linq to SQL.
Поскольку наш объект представляет собой простой Dictonary, мы перебираем ненужные элементы и удаляем их из словаря.
Наконец, снова сериализуйте ваш словарь.
public string JsonMinusProperties(object toSerialize)
{
//Replace this with your preferred way of getting your unwanted properties
var LinqMemberNames = toSerialize.GetType().GetProperties().Where(y=>
y.GetCustomAttributes(true).Any(x =>
x.GetType().Namespace == "System.Data.Linq.Mapping"
)
).Select(x=>x.Name);
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(toSerialize);
var tempobj = js.DeserializeObject(json) as Dictionary<string, object>;
foreach (string linqMember in LinqMemberNames)
{
tempobj.Remove(linqMember);
}
return js.Serialize(tempobj);
}
Это удалит только с первого уровня, хотя в принципе должно быть легко пройти словарь, если требуется удалить более глубокие свойства.