Web API 返回JSon格式

.NET Web API中

环境:

Newtonsoft.Json v9.0.0.1

1. 全局配置:

  APPlication_Start()中配置以下代码, 可以将所有返回的JSon字段都转化为驼峰格式:

GlobalConfiguration.Configure.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

在应用全局配置之后, 如果不为JsonProperty添加NamingStrategy, 则JsonProperty上声明的Name也会被应用为驼峰格式. 可以通过下面的自定义配置实现例外配置

2. 自定义配置:

  继承NamingStrategy后, 实现方法GetPropertyName就可以实现例外配置, 最终返回的Json字符串格式就是这个方法GetPropertyName的返回值.

3. 关于自定义配置的解析:

调用路径:

DefaultContractResolver..CreateObjectContract()->CreateProperties()->遍历Member, 调用CreateProperty(): JsonProperty property = CreateProperty(member, memberSerialization);->SetPropertySettingsFromAttributes()->

在方法SetPropertySettingsFromAttributes()中, 

  1. 如果存在JsonPropertyAttribute/JsonContainerAttribute特性, 以及属性NamingStrategy->调用方法GetPropertyName();

  2. 否则调用ResolvePropertyName, 也就是DefaultContractResolver中自带的NamingStrategy属性(CamelCasePropertyNamesContractResolver就实现了自己的NamingStrategy, DefaultContractResolver的NamingStrategy为空, 但是可以在外部赋值).

  3. 也就是说, 可以给DefaultContractResolver赋值来自定义格式:

var resolver = new DefaultContractResolver();
resolver.NamingStrategy = new TestStrategy();
config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings()
{
    ContractResolver = resolver
};
调用namingStrategy源代码:
if (namingStrategy != null)
{
    property.PropertyName = namingStrategy.GetPropertyName(mappedName, hasSpecifiedName);
}
else
{
    property.PropertyName = ResolvePropertyName(mappedName);
}

我的简单实例:

public class Strategy4JsonProperty : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        throw new NotImplementedException();
    }

    public override string GetPropertyName(string name, bool hasSpecifiedName)
    {
        return name + "!!!";
    }
}

[JsonObject(NamingStrategyType = typeof(Strategy4JsonProperty))]
public partial class ResearchList
{

    public Guid Id { get; set; }
    public string Name { get; set; }

}
public partial class TEST
{
    [JsonProperty(NamingStrategyType = typeof(Strategy4JsonProperty))]
    public Guid Id { get; set; }
    public string Name { get; set; }

}
View Code

结论: 外部用全局配置, 内部使用特性加策略, 可以实现不同类型的Json返回格式.

猜你喜欢

转载自www.cnblogs.com/duliduibai/p/11311086.html