Caso cammello predefinito dei nomi di proprietà nella serializzazione JSON

Ho un sacco di classi che saranno serializzate su JSON ad un certo punto e per il rispetto di entrambe le convenzioni C # sul back-end e le convenzioni JavaScript sul front-end, ho definito proprietà come questa:

[JsonProperty(PropertyName="myFoo")] public int MyFoo { get; set; } 

In modo che in C # posso:

 MyFoo = 10; 

E in Javascript posso:

 if (myFoo === 10) 

Ma fare questo per ogni proprietà è noioso. Esiste un modo semplice e veloce per impostare il modo predefinito in cui JSON.Net gestisce i nomi delle proprietà, in modo che cammini automaticamente sul caso a meno che non venga indicato diversamente?

È ansible utilizzare la class fornita Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver :

 var serializer = new JsonSerializer { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var jobj = JObject.FromObject(request, serializer); 

In altre parole, non è necessario creare personalmente un resolver personalizzato.

Quando serializzi il tuo object, passa alcune impostazioni personalizzate.

 var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var json = JsonConvert.SerializeObject(yourObject, settings); 

Puoi utilizzare un risolutore di contratto personalizzato:

 class MyContractResolver : DefaultContractResolver { protected override IList 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; } } 

E usalo come:

 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() }); 

Dal momento che la risposta accettata è solo link, aggiungo il codice effettivo che ho utilizzato (nel caso in cui il link muoia). È in gran parte lo stesso di quello che c’era nel link:

 // 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; } } 

L’unica modifica che ho apportato è stata l’aggiunta di attr.PropertyName != null alla clausola if a causa del caso in cui avevo aggiunto qualcosa del tipo:

 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string SomeProperty { get; set; } 

E non volevo specificare il PropertyName (quindi è null). Quanto sopra sarà serializzato in JSON come someProperty .

JObject.FromObject utilizza le impostazioni predefinite di default di JsonConvert . C’è una proprietà func che puoi assegnare in questo modo:

  JsonConvert.DefaultSettings = () => new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; 

e ogni volta che chiami Jobject.FromObject , userà questa funzione per build le impostazioni.

Meglio usare la nuova CamelCaseNamingStrategy :

 new JsonSerializerSettings() { ContractResolver = new new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() } }; 

Di default non sostituisce i nomi personalizzati impostati da JsonPropert('Name') . (Puoi cambiare il comportamento di CamelCaseNamingStrategy(bool, bool) ctor.) Quindi, non è necessario creare classi personalizzate come la risposta di @Matt Burland.