Suggerirei di andare in modo diverso. Mantieni il tuo modello di oggetto C# il più standard possibile (non utilizzerei il segno @
e C# keywords
come nome proprietà).
Possiamo separare il mondo serializzato (JSON) e gli oggetti C#, semplicemente utilizzando le funzionalità di Json.NET.
Uno dei più semplice da usare è decorazione con attributo:
[JsonProperty(PropertyName = "default")]
public string DefaultValue { get; set; }
In questo caso dobbiamo fare riferimento Newtonsoft.Json nel progetto. Se deve essere POCO, possiamo introdurre CustomResolver
derrived da DefaultContractResolver
e definiamo queste conversioni lì ...
Ma la separazione di preoccupazione in questo caso è un po 'la soluzione più puro, direi
EDIT: JSON contratto Resolver progetto(vedi commenti)
Nota importante: Newtonsoft.Json fa parte delle API Web. Non solo è un open source, ma anche il team di MS punta su questo come serializer JSON di base.
1) Newtonsoft.Json (come parte di Web.API) è già installato nella soluzione. Quindi non devi scaricare (nuget) separatamente. Sarebbe sempre nella tua cartella packages
. Quindi, per usare l'attributo è sufficiente aggiungere il riferimento. È qui...
2) C'è una piccola bozza su come fare per gli attributi, mantenendo il POCO. Come ho cercato di spiegare qui: POCO's, behavior and Peristance Igorance, per mantenere POCO (ad esempio, sfruttiamo l'architettura a strati con NHibernate su un livello dati), possiamo sostituire gli attributi con un Contract Resolver
. La nostra biblioteca POCO non deve fare riferimento a qualcosa di
Non ci resta che fare estendere il livello di servizio:
public class MyResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(
MemberInfo member,
MemberSerialization memberSerialization)
{
var jProperty = base.CreateProperty(member, memberSerialization);
var propertyInfo = member as PropertyInfo;
if (propertyInfo == null)
{
return jProperty;
}
// just adjust in case if Property name is DefaultValue
var isDefaultValueProeprty =
propertyInfo.Name.Equals("DefaultValue");
if(isDefaultValueProeprty)
{
jProperty.PropertyName = "default";
}
return jProperty;
}
...
In questo modo abbiamo fornito le stesse informazioni a serailizer come con il [JsonPropertyAttribute]
.
Ora, dobbiamo solo usarlo. Ci sono molti modi (ad esempio globale) ma possiamo farlo solo per un controller:
protected override void Initialize(HttpControllerContext context)
{
base.Initialize(context);
var jSettings = context.Configuration.Formatters.JsonFormatter.SerializerSettings;
jSettings.ContractResolver = MyResolver;
}
si può provare questa 'stringa pubblica selezionata {get; impostato; } ' – Sender