2012-03-15 12 views
5

Zacząłem używać json.net do tworzenia lepszych DateTimes, ale zauważyłem, że jedna z moich właściwości nie jest serializowana. Nie ma programu ustawiającego, a jego program pobierający jest zależny od innego elementu obiektu, np.Właściwość getter Json.net nie jest serializowana

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

Zrobiłem klasę, która dziedziczy z JsonResult i głównym linii to:

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

Czy ktoś może mi powiedzieć, jak zmusić go do serializacji tej nieruchomości?

Edytuj: Aby wyjaśnić - był to uproszczony przykład. Zaktualizowałem go, aby odzwierciedlić, że najpierw wrzucam int do dziesiętnego. Zapomniałem wcześniej sprawdzić, ale właściwość jest częścią klasy częściowej, ponieważ jest zwracana z usługi WCF. Deklaruję tę własność w moim zgromadzeniu, więc czy to może być wskazówka?

Odpowiedz

15

Nie ma nic złego w JSON. netto. Może serializować właściwości tylko do odczytu. Problem jest w swojej AmountInPounds

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

ponieważ Twój robią podział całkowitą z / 100 oznacza to dostaniesz 0 jeśli AmountInPence jest mniejsza niż 100.

Co trzeba jest użycie m suffix z okazji 100 jak decimal:

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

aby uzyskać odpowiedni wynik w AmountInPounds.

EDIT po komentarzach:

Obliczona nieruchomość AmountInPounds był w częściowej klasy z usługą WCF generowała DataContract.

W przypadku DataContract, jeśli właściwość nie jest oznaczona DataMemberAttribute, wygląda na to, że nie zostanie przekształcona do postaci szeregowej.

Więc obok PO za odpowiedź:

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

to też działa:

[System.Runtime.Serialization.DataMemberAttribute()] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

Dzięki za odpowiedź. Nie sądzę, że to z tego powodu (zredagowałem moje pytanie). – NickL

+0

OK, wtedy powinieneś podać więcej kontekstu. Co to jest "Dane", co próbujesz serializować? Co to jest wyjście? Ponieważ jako @StriplingWarrior również wskazano: JsonConvert serializuje 'AmountInPounds' ... – nemesv

+0

Dane to obiekt - własność JsonResult. Czy najpierw trzeba by go obsadzić? – NickL

2

To powinno działać dla Ciebie. Poniższy program w LINQPad działa dobrze:

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

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

wyjścia:

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

1

OK wygląda Znalazłem odpowiedź, przepraszam za nie zapewnienie więcej szczegółów w poście, ale Nie sądzę, żeby to miało znaczenie w końcu.

Musiałem dodać atrybut na posesji AmountInPounds:

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

Cieszę się, że znalazłeś rozwiązanie, ale nadal jest bardzo dziwne. Ponieważ nie udało mi się odtworzyć problemu nie z klasami częściowymi lub dziedziczeniem lub z właściwościami zerowymi. 'Newtonsoft.Json w wersji 4.0.8' zawsze zawierał właściwości readonly ... – nemesv

+0

Tak, stworzyłem oddzielne rozwiązanie, które powiela wszystko oprócz klasy tworzonej przez usługę WCF i działało zgodnie z oczekiwaniami. Być może istnieje atrybut na tej klasie, który uniemożliwia Json.Net automatyczne serializowanie tych właściwości tylko do odczytu. Dziękuję za Twój czas! – NickL

+0

Wygląda na to, że 'DataMemberAttribute' również rozwiązuje twój problem, nie wiem dlaczego może to błąd w Json.net. Jednak zaktualizowałem też moją odpowiedź tymi informacjami. – nemesv

Powiązane problemy