Tengo la siguiente cadena JSON que se recibe de una 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"
}
}
]
}
Mis clases de mapeo:
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; }
}
La pregunta es que no me gusta el Attributes
nombre de la clase y los attributes
nombres de campo en la Team
clase. En cambio, quiero que se nombre TeamScore
y también que se elimine _
de los nombres de campo y se den los nombres propios.
JsonConvert.DeserializeObject<RootObject>(jsonText);
Puedo cambiar el nombre Attributes
a TeamScore
, pero si cambio el nombre del campo ( attributes
en la Team
clase), no se deserializará correctamente y me dará null
. ¿Cómo puedo superar esto?
Respuestas:
Json.NET tiene un
JsonPropertyAttribute
que le permite especificar el nombre de una propiedad JSON, por lo que su código debe ser:Documentación: Atributos de serialización
fuente
Si desea utilizar el mapeo dinámico, y no quiere saturar su modelo con atributos, este enfoque funcionó para mí
Uso:
Lógica:
fuente
Agregando a la solución Jacks. Necesito deserializar usando JsonProperty y Serialize mientras ignoro JsonProperty (o viceversa). ReflectionHelper y Attribute Helper son solo clases de ayuda que obtienen una lista de propiedades o atributos para una propiedad. Puedo incluir si a alguien realmente le importa. Usando el siguiente ejemplo, puede serializar el modelo de vista y obtener "Cantidad" aunque la Propiedad Json sea "Precio recurrente".
Uso:
Modelo:
fuente
CreateProperty
en ContractResolver. Llama a la base:var jsonProperty = base.CreateProperty(memberInfo, memberSerialization);
y luego establecejsonProperty.PropertyName = memberInfo.Name;
. Finalmentereturn jsonProperty;
eso es todo lo que necesitas.Ampliando la respuesta de Rentering.com , en escenarios en los que se debe ocupar un gráfico completo de muchos tipos, y está buscando una solución fuertemente tipada, esta clase puede ayudar, vea el uso (fluido) a continuación. Funciona como una lista negra o una lista blanca por tipo. Un tipo no puede ser ambos ( Gist : también contiene una lista global de ignorados).
Uso:
fuente
Estoy usando los atributos JsonProperty cuando serializo pero los ignoro cuando deserializo usando esto
ContractResolver
:El
ContractResolver
simplemente se pone cada vuelta propiedad a nombre de la propiedad de clase (simplificado de la solución de Shimmy). Uso:fuente