c# - Caso de camello predeterminado de los nombres de propiedad en la serialización JSON
json.net camelcasing (5)
Puede usar una resolución de contrato personalizada:
class MyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
foreach (var property in properties)
{
property.PropertyName = char.ToLower(property.PropertyName[0]) + string.Join("", property.PropertyName.Skip(1));
}
return properties;
}
}
Y úsalo como:
class MyClass
{
public int MyProperty { get; set; }
public int MyProperty2 { get; set; }
}
var json = JsonConvert.SerializeObject(new MyClass(),
Formatting.Indented,
new JsonSerializerSettings { ContractResolver = new MyContractResolver() });
Tengo un montón de clases que se serializarán en JSON en algún momento y, con el objetivo de seguir las convenciones de C # en el back-end y las convenciones de JavaScript en el front-end, he estado definiendo propiedades como esta:
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
Para que en C # yo pueda:
MyFoo = 10;
Y en Javascript puedo:
if (myFoo === 10)
Pero hacer esto para cada propiedad es tedioso. ¿Existe una manera rápida y fácil de establecer la forma predeterminada en que JSON.Net maneja los nombres de las propiedades para que se haga automáticamente en camello a menos que se indique lo contrario?
Puede usar la clase proporcionada Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver :
var serializer = new JsonSerializer
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jobj = JObject.FromObject(request, serializer);
En otras palabras, no tiene que crear una resolución personalizada usted mismo.
Al serializar su objeto, pase algunas configuraciones personalizadas.
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
JObject.FromObject
utiliza la configuración predeterminada de los valores predeterminados de JsonConvert
. Hay una propiedad func que puede asignar de esta manera:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
y siempre que llame a Jobject.FromObject
, usará este func para construir configuraciones.
Como la respuesta aceptada es solo de enlace, agrego el código real que terminé usando (en caso de que el enlace muera). En general es lo mismo que lo que estaba en el enlace:
// Automatic camel casing because I''m bored of putting [JsonProperty] on everything
// See: http://harald-muehlhoff.de/post/2013/05/10/Automatic-camelCase-naming-with-JsonNET-and-Microsoft-Web-API.aspx#.Uv43fvldWCl
public class CamelCase : CamelCasePropertyNamesContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization memberSerialization)
{
var res = base.CreateProperty(member, memberSerialization);
var attrs = member.GetCustomAttributes(typeof(JsonPropertyAttribute), true);
if (attrs.Any())
{
var attr = (attrs[0] as JsonPropertyAttribute);
if (res.PropertyName != null && attr.PropertyName != null)
res.PropertyName = attr.PropertyName;
}
return res;
}
}
El único cambio que hice fue la adición de attr.PropertyName != null
a la cláusula if debido al caso en el que agregué algo como:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string SomeProperty { get; set; }
Y no quería especificar el PropertyName
(por lo que es nulo). Lo anterior se serializará en JSON como someProperty
.