Свойство получения Json.net не сериализовано - PullRequest
6 голосов
/ 16 марта 2012

Я начал использовать json.net для создания лучших DateTimes, но заметил, что одно из моих свойств не сериализуется.У него нет установщика, и его получатель зависит от другого члена объекта, например

public int AmountInPence { get; set;}
public decimal AmountInPounds { get { return (decimal)AmountInPence / 100;  } }

Я создал класс, который наследуется от JsonResult, а основная строка:

string serializedObject = JsonConvert.SerializeObject(Data, new IsoDateTimeConverter());

Может кто-нибудь сказать мне, как заставить его сериализовать это свойство?

Редактировать: Просто чтобы уточнить - это был упрощенный пример.Я обновил его, чтобы отразить, что сначала я приводю int к десятичному типу.Я забыл проверить ранее, но свойство является частью частичного класса, потому что оно возвращается из службы WCF.Я объявляю это свойство в моей сборке, так может ли это быть подсказкой?

Ответы [ 3 ]

16 голосов
/ 16 марта 2012

В Json.net нет ничего плохого. Он может сериализовать свойства только для чтения. Проблема в вашем AmountInPounds

public decimal AmountInPounds { get { return AmountInPence / 100;  } }

Поскольку вы делаете целочисленное деление с / 100, это означает, что вы получите 0, если AmountInPence меньше 100.

Вам нужно использовать суффикс m , чтобы пометить 100 как decimal:

public decimal AmountInPounds { get { return AmountInPence / 100m;  } }

чтобы получить правильный результат в AmountInPounds.

РЕДАКТИРОВАТЬ после комментариев:

Расчетное свойство AmountInPounds было в частичном классе сгенерированной службы WCF DataContract.

А в DataContract, если свойство не помечено DataMemberAttribute, похоже, оно не будет сериализовано.

Итак, кроме ответа ОП:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)]
public decimal AmountInPounds { get { return (decimal)AmountInPence / 100;  } }

Это тоже работает:

[System.Runtime.Serialization.DataMemberAttribute()]
public decimal AmountInPounds { get { return (decimal)AmountInPence / 100; } }
2 голосов
/ 16 марта 2012

ОК, похоже, я нашел ответ, извините за то, что не предоставил более подробную информацию в сообщении, но я не думаю, что это имело значение в конце.

Мне нужно было добавить атрибут в свойстве AmountInPounds:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)]
public decimal AmountInPounds { get { return (decimal)AmountInPence / 100;  } }
2 голосов
/ 16 марта 2012

Это должно работать на вас. Следующая программа в LINQPad работает нормально:

void Main()
{
    JsonConvert.SerializeObject(new A(), new IsoDateTimeConverter()).Dump();
}

public class A
{
    public int AmountInPence { get; set;}
    public decimal AmountInPounds { get { return AmountInPence / 100;  } }
}

Выход:

{ "AmountInPence": 0, "AmountInPounds": 0.0}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...