JavaScriptSerializer. Как игнорировать свойство

#c# #.net #json #javascriptserializer

#c# #.net #json #javascriptserializer

Вопрос:

Я знаю о ScriptIgnoreAttribute .

Но что, если я хочу игнорировать свойство, основанное на критериях. Например, как игнорировать свойство с нулевым значением при сериализации, только если оно равно null и не содержит никакого значения?

Ответ №1:

https://learn.microsoft.com/dotnet/api/system.web.script.serialization.scriptignoreattribute

Используйте [ScriptIgnore]

 using System;
using System.Web.Script.Serialization;

public class Group
{
    // The JavaScriptSerializer ignores this field.
    [ScriptIgnore]
    public string Comment;

    // The JavaScriptSerializer serializes this field.
    public string GroupName;
}
  

Комментарии:

1. Я не поддержал это, потому что, хотя это помогло мне, это не отвечает на заданный вопрос.

2. Работает ли это со свойствами, которые были реализованы для интерфейса? поскольку я все еще получаю ошибку при десериализации JSON? Поскольку в моем случае это не сработало

Ответ №2:

Лучший возможный ответ, который у меня есть, — создать свой собственный JavaScriptConverter и проанализировать свойство на основе ваших собственных условий.

 public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
  //...
  if (!object.ReferenceEquals(dictionary["MyProperty"],null)){
    // My Code
  }
  //...
}
  

Комментарии:

1. Я решил использовать метод, который вернет словарь, содержащий только те объекты, которые необходимо сериализовать. А затем сериализовать этот словарь.

2. @Agzam: Перебор? Спорно. Если вы хотели получить полный контроль над сериализацией объектов, то следует пойти по этому пути. Класс JavaScriptSerializer в любом случае возвращает собственный словарь, это просто дает вам свободу размещения его в вашем собственном пользовательском объекте. Когда я имею дело с абстрактной информацией, я обычно использую ключевое слово dynamic и анализирую данные самостоятельно.

Ответ №3:

Я использовал внутренние вместо общедоступных свойств, и у меня это сработало