Сериализатор, который игнорирует члены класса, которые не установлены [duplicate]

Сначала javascript пытается преобразовать строку 'b' в число и возвращает NaN, потому что 'b' не может преобразовать в число. Затем 'a' + 'NaN' соединяется с новой строкой 'aNaN'. То же самое в вашем примере:

$('#message').html('' + + ' new message');

Javascript пытается преобразовать + ' new message' в число и возвращает NaN. Затем '' + 'NaN' создает новый текст span и NaN как текст.

Посмотрите:

Унарный плюс (+)

Оператор унарного плюса предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если оно еще не было. Хотя унарное отрицание (-) также может конвертировать не числа, унарный плюс является самым быстрым и предпочтительным способом преобразования чего-либо в число, поскольку он не выполняет никаких других операций над номером. Он может преобразовывать строковые представления целых чисел и float, а также значения, отличные от строки, true, false и null. Поддерживаются целые числа в десятичных и шестнадцатеричных форматах («0x» -предоставляемые). Отрицательные числа поддерживаются (хотя и не для hex). Если он не может разобрать определенное значение, он будет оценивать NaN.

blockquote>

33
задан frankadelic 7 September 2009 в 07:00
поделиться

7 ответов

Решение, которое сработало для меня:

Сериализованный класс и свойства будут оформлены следующим образом:

[DataContract]
public class MyDataClass
{
  [DataMember(Name = "LabelInJson", IsRequired = false)]
  public string MyProperty { get; set; }
}

IsRequired был ключевым элементом.

Фактическая сериализация может быть выполнена с помощью DataContractJsonSerializer:

public static string Serialize<T>(T obj)
{
  string returnVal = "";
  try
  {
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    using (MemoryStream ms = new MemoryStream())
    {
      serializer.WriteObject(ms, obj);
      returnVal = Encoding.Default.GetString(ms.ToArray());
    }
  }
  catch (Exception /*exception*/)
  {
    returnVal = "";
    //log error
  }
  return returnVal;
}
12
ответ дан Mark Heath 18 August 2018 в 02:50
поделиться
  • 1
    Для DataContractJsonSerializer вам необходимо установить значение EmitDefaultValue на false в DataMember – FinnNk 4 February 2012 в 13:55
  • 2
    это кажется интересным, но требует большего объяснения, особенно первого кода – KansaiRobot 2 July 2018 в 09:44
29
ответ дан AdamE 18 August 2018 в 02:50
поделиться

Этот код является значением блока null и значением по умолчанию (0) для числовых типов

    private class NullPropertiesConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            var jsonExample = new Dictionary<string, object>();
            foreach (var prop in obj.GetType().GetProperties())
            {
                //this object is nullable 
                var nullableobj = prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>);
                //check if decorated with ScriptIgnore attribute
                bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true);

                var value = prop.GetValue(obj, System.Reflection.BindingFlags.Public, null, null, null);
                int i;
                //Object is not nullable and value=0 , it is a default value for numeric types 
                if (!(nullableobj == false && value != null && (int.TryParse(value.ToString(), out i) ? i : 1) == 0) && value != null && !ignoreProp)
                    jsonExample.Add(prop.Name, value);
            }

            return jsonExample;
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get { return GetType().Assembly.GetTypes(); }
        }
    }
1
ответ дан Ali B. 18 August 2018 в 02:50
поделиться
0
ответ дан Daniel Mohr 18 August 2018 в 02:50
поделиться

Json.NET имеет опции автоматического исключения значений нуля или по умолчанию.

3
ответ дан James Newton-King 18 August 2018 в 02:50
поделиться
0
ответ дан Sameer 18 August 2018 в 02:50
поделиться

Вы можете реализовать JavaScriptConverter и зарегистрировать его с помощью метода RegisterConverters в JavaScriptSerializer.

4
ответ дан Vinay Sajip 18 August 2018 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: