2014-02-12 3 views
2

JSON을 통해 라운드 트립하고있는 간단한 객체가 있습니다. 그것은 잘 serialize합니다,하지만 그것을 하나의 값을 기본값으로 (이 특별한 경우) 0으로 설정되어 deserialize합니다. 왜 그런가요?역 직렬화시 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; 
    } 
} 

{"CurrencyCode":"USD", "Rate": 1.10231} 같은 무언가로 JSON으로 직렬화 :

여기 내 개체입니다. 하지만 내가 deserialize 때 Rate 필드는 항상 0로 설정됩니다. CurrencyCode 필드가 올바르게 설정되었으므로 명확하게 deserialization이 완전히 실패하지 않고 하나의 필드 만 실패합니다.

+0

나는 downvote가 무엇인지 궁금하니? 누군가 내가 방금 나에게 대답 한 두 가지 다른 질문을 통과했기 때문에 StackOverflow의 완전히 지원되는 기능이라고 지적 할 것입니다. "Ask a question"서식에는 "자신의 질문에 대답 - 지식 Q & A 스타일을 공유하십시오."라는 체크 박스가 있습니다. –

답변

5

생성자 매개 변수의 이름이 잘못되었습니다.

매개 변수없는 생성자가 없으므로 JSON.net은 매개 변수와 함께 생성자를 사용하고 이러한 매개 변수에 값을 제공해야합니다. 이름을 비교하여 JSON 문자열의 필드와 생성자의 매개 변수를 비교합니다. CurrencyCodecurrencyCode에 충분히 근접하기 때문에 통화 코드에서 작동합니다. 하지만 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; 
    } 
} 
관련 문제