Eu tenho a seguinte sequência JSON que é recebida de uma parte externa.
{
"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"
}
}
]
}
Minhas aulas de mapeamento:
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; }
}
A questão é que eu não gosto do Attributes
nome da classe e dos attributes
nomes dos campos na Team
classe. Em vez disso, quero que ele seja nomeado TeamScore
e também remova _
dos nomes dos campos e forneça nomes próprios.
JsonConvert.DeserializeObject<RootObject>(jsonText);
Eu posso renomear Attributes
para TeamScore
, mas se eu alterar o nome do campo ( attributes
na Team
classe), ele não será desserializado corretamente e me fornecerá null
. Como posso superar isso?
Respostas:
O Json.NET possui um
JsonPropertyAttribute
que permite especificar o nome de uma propriedade JSON, portanto seu código deve ser:Documentação: Atributos de serialização
fonte
Se você deseja usar o mapeamento dinâmico e não deseja sobrecarregar seu modelo com atributos, essa abordagem funcionou para mim
Uso:
Lógica:
fonte
Adicionando à solução de Jacks. Preciso desserializar usando o JsonProperty e Serialize enquanto ignoro o JsonProperty (ou vice-versa). ReflectionHelper e Attribute Helper são apenas classes auxiliares que obtêm uma lista de propriedades ou atributos para uma propriedade. Posso incluir se alguém realmente se importa. Usando o exemplo abaixo, você pode serializar o viewmodel e obter "Amount", mesmo que o JsonProperty seja "RecurringPrice".
Uso:
Modelo:
fonte
CreateProperty
no ContractResolver. Aí chama a base:var jsonProperty = base.CreateProperty(memberInfo, memberSerialization);
e depois definejsonProperty.PropertyName = memberInfo.Name;
. Finalmente,return jsonProperty;
é tudo o que você precisa.Expandindo a resposta da Rentering.com , em cenários em que é necessário cuidar de um gráfico inteiro de muitos tipos e você está procurando uma solução fortemente tipada, esta classe pode ajudar a ver o uso (fluente) abaixo. Opera como lista negra ou lista branca por tipo. Um tipo não pode ser ambos ( Gist - também contém lista de ignorados global).
Uso:
fonte
Estou usando atributos JsonProperty ao serializar, mas ignorando-os ao desserializar usando isso
ContractResolver
:O
ContractResolver
just retorna todas as propriedades ao nome da propriedade da classe (simplificado da solução de Shimmy). Uso:fonte