简体   繁体   中英

Json.Net WEB API default camelCase property name but one class

I have a section in WebApiConfig:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
    new CamelCasePropertyNamesContractResolver();

But there is one class, which property name I want to be intact (UPPERCASE).

Is there any way to override default transformation for a single case? I'm returning HttpResponseMessage from API method.

[HttpGet]
[Route("lang/{lang}")]
public HttpResponseMessage GetTranslation(TranslateLang lang)
{
    var translations = new Translate().GetLibrary()
        .Where(t => t.LangsTranslations.Any(l => l.Language == lang))
        .ToDictionary(
            l => l.Key, 
            l => l.LangsTranslations.First(x => x.Language == lang).Text
        );
    return Request.CreateResponse(HttpStatusCode.OK, translations);
}

Thx.

The solution:

Custom ContractResolver

public class UpperCaseContractResolver : DefaultContractResolver
{
    public static readonly UpperCaseContractResolver Instance = new UpperCaseContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        property.PropertyName = property.PropertyName.ToUpper();
        return property;
    }
}

Usage:

[HttpGet]
[Route("lang/{lang}")]
public HttpResponseMessage GetTranslation(TranslateLang lang)
{
    var translations = new Translate().GetLibrary()
        .Where(t => t.LangsTranslations.Any(l => l.Language == lang))
        .ToDictionary(
            l => l.Key, 
            l => l.LangsTranslations.First(x => x.Language == lang).Text
        );

    var formatter = new JsonMediaTypeFormatter();
    var json = formatter.SerializerSettings;

    json.ContractResolver = new UpperCaseContractResolver();

    return Request.CreateResponse(HttpStatusCode.OK, translations, formatter);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM