2014-02-12 6 views
2

У меня есть простой объект, который я просматриваю через JSON. Он сериализуется просто отлично, но я десериализую его, для одного из значений установлено значение по умолчанию (0, в данном конкретном случае). Почему это?Параметр конструктора JSON.Net отсутствует при десериализации

Вот мой объект:

public class CurrencyExchangeRate 
{ 
    public string CurrencyCode { get; private set; } 
    public decimal Rate { get; private set; } 

    public CurrencyExchangeRate(string currencyCode, decimal exchangeRate) 
    { 
     this.CurrencyCode = currencyCode; 
     this.Rate = exchangeRate; 
    } 
} 

Это упорядочивает в JSON как нечто вроде {"CurrencyCode":"USD", "Rate": 1.10231}. Но когда я десериализую его, поле Rate всегда установлено на 0. Поле CurrencyCode правильно установлено, поэтому четко десериализация полностью не прерывается, только одно поле не работает.

+0

Мне любопытно, для чего был downvote? Поскольку кто-то просто прошел и запустил еще два вопроса, на которые я ответил сам, я просто укажу, что это фактически полностью поддерживаемая функция StackOverflow. Есть даже флажок «ответить на свой вопрос - поделитесь своими знаниями Q & A style» в форме «Задайте вопрос». –

ответ

5

Параметры конструктора названы неправильными.

Поскольку нет конструктора без параметров, JSON.net вынужден использовать конструктор с параметрами и предоставить значения для этих параметров. Он пытается сопоставить поля из строки JSON с параметрами вашего конструктора, сравнивая их имена. Это работает для кода валюты, потому что CurrencyCode достаточно близко к currencyCode. Но имя поля JSON Rate слишком отличается от параметра конструктора exchangeRate, поэтому JSON.net не может понять, что это то же самое. Таким образом, он пропускает значение по умолчанию для этого типа, 0m в этом случае. Исправлена ​​проблема с изменением имени параметра конструктора на rate.

public class CurrencyExchangeRate 
{ 
    public string CurrencyCode { get; private set; } 
    public decimal Rate { get; private set; } 

    //NOTE changed parameter name! 
    public CurrencyExchangeRate(string currencyCode, decimal rate) 
    { 
     this.CurrencyCode = currencyCode; 
     this.Rate = rate; 
    } 
} 
Смежные вопросы