Mam następujący ciąg JSON, który jest odbierany od strony zewnętrznej.
{
"team":[
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"home",
"score":"22",
"team_id":"500"
}
},
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"away",
"score":"30",
"team_id":"600"
}
}
]
}
Moje klasy mapowania:
public class Attributes
{
public string eighty_min_score { get; set; }
public string home_or_away { get; set; }
public string score { get; set; }
public string team_id { get; set; }
}
public class Team
{
public string v1 { get; set; }
public Attributes attributes { get; set; }
}
public class RootObject
{
public List<Team> team { get; set; }
}
Pytanie brzmi: nie podoba mi się Attributes
nazwa klasy i attributes
nazwy pól w Team
klasie. Zamiast tego chcę, aby została nazwana, TeamScore
a także usunąć _
z nazw pól i nadać imiona własne.
JsonConvert.DeserializeObject<RootObject>(jsonText);
Mogę zmienić nazwę Attributes
na TeamScore
, ale jeśli zmienię nazwę pola ( attributes
w Team
klasie), nie spowoduje to deserializacji poprawnie i da mi null
. Jak mogę to przezwyciężyć?
Odpowiedzi:
Json.NET ma opcję ,
JsonPropertyAttribute
która pozwala określić nazwę właściwości JSON, więc twój kod powinien być:Dokumentacja: atrybuty serializacji
źródło
Jeśli chcesz użyć dynamicznego mapowania i nie chcesz zaśmiecać swojego modelu atrybutami, takie podejście zadziałało dla mnie
Stosowanie:
Logika:
źródło
Dodanie do rozwiązania Jacka. Muszę deserializować przy użyciu JsonProperty i szeregować, ignorując JsonProperty (lub odwrotnie). ReflectionHelper i Attribute Helper to tylko klasy pomocnicze, które otrzymują listę właściwości lub atrybutów dla właściwości. Mogę załączyć, jeśli ktoś naprawdę to obchodzi. Korzystając z poniższego przykładu, możesz serializować viewmodel i uzyskać „Kwotę”, nawet jeśli JsonProperty to „RecurringPrice”.
Stosowanie:
Model:
źródło
CreateProperty
w ContractResolver. Tam wywołuje bazę:var jsonProperty = base.CreateProperty(memberInfo, memberSerialization);
a następnie ustawiajsonProperty.PropertyName = memberInfo.Name;
. Wreszciereturn jsonProperty;
to wszystko, czego potrzebujesz.Rozszerzając odpowiedź Rentering.com , w scenariuszach, w których należy zadbać o cały wykres wielu typów, a szukasz silnie typowanego rozwiązania, ta klasa może pomóc, zobacz użycie (płynnie) poniżej. Działa jako czarna lista lub biała lista dla każdego typu. Typ nie może być jednocześnie ( Gist - zawiera także globalną listę ignorowanych).
Stosowanie:
źródło
Korzystam z atrybutów JsonProperty podczas serializacji, ale ignoruję je podczas deserializacji przy użyciu tego
ContractResolver
:Po
ContractResolver
prostu przywraca każdą właściwość do nazwy właściwości klasy (uproszczonej z rozwiązania Shimmy). Stosowanie:źródło