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返回格式.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM