2016-09-17 40 views
0

使用Web API在Azure表存儲中返回數據。我返回一個類,我在一個類中繼承TableEntity並添加屬性,但希望保留大寫屬性名稱的.Net約定,但也要遵守小寫屬性名稱的JavaScript/json約定。Azure表中的TableEntity中的序列化屬性存儲

我已經嘗試將Json.net屬性屬性添加到類,但它似乎被忽略。例如爲:

[JsonProperty( 「ID」)] 公共字符串ID {得到;集;}

如果實例對ID設置的值,零是表示在序列化結果。

回答

0

僅供參考 - 雖然這並沒有回答如何讓TableEntity尊重JSON.net屬性的直接答案......我能夠通過覆蓋繼承類中的ReadEntity和WriteEntity方法來解決用例問題:

eg

public class User : TableEntity{ 
    //Upper case name 
    public string Name {get; set}; 
    public override void ReadEntity(IDictionary<string, AzureTableStorage.EntityProperty> properties, OperationContext operationContext){ 
     base.ReadEntity(properties, operationContext); 
     //lower case 
     this.Name = properties["name"]; 
    } 
0

根據你的描述,我在我身邊測試了這個問題,發現它適合我和Azure。這是我詳細的步驟,你可以參考它。

創建一個名爲UserInfoController在Web API應用與Get功能像這樣的控制器:

public class User : TableEntity 
{ 
    public User(string partitionKey, string rowKey) 
    { 
     this.PartitionKey = partitionKey; 
     this.RowKey = rowKey; 
    } 
    public User() { } 

    [JsonProperty("id")] 
    public long ID { get; set; } 
    [JsonProperty("username")] 
    public string UserName { get; set; } 
    [JsonProperty("phone")] 
    public string Phone { get; set; } 
    [JsonProperty("age")] 
    public int Age { get; set; } 
} 

結果

// GET: api/UserInfo 
[HttpGet] 
public async Task<string> Get() 
{ 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(<your-Storage-ConnectionString>); 
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); 
    CloudTable cloudTable = tableClient.GetTableReference("UserInfo"); 
    TableQuery<User> query = new TableQuery<User>() 
     .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "Grade Four")); 
    var results =await cloudTable.ExecuteQuerySegmentedAsync(query, null); 
    //Serialize the object to string by using the latest stable version of Newtonsoft.Json 
    string jsonString = JsonConvert.SerializeObject(results); 
    return jsonString; 
} 

實體將Web API應用程序部署到Azure,然後通過Fiddler調用該函數,可以找到以下結果。

總之,請嘗試檢查您正在使用的Json.NET的版本。如果您沒有使用最新版本(9.0.1),請嘗試升級到最新版本並再次運行您的應用程序,以確定它是否可以按預期工作。

+0

嗯,我想我可以返回類型更改爲字符串,但因爲其他內部操作直接調用的函數,如果喜歡它返回的對象,在你的榜樣重新運行用戶,以避免deserilaization在額外開銷那些調用它的函數。 – frigon

+0

根據你的評論,我改變了'Get'函數的返回類型爲'Task >',然後我可以按照預期得到序列化結果。另外,你可以通過在你的'WebApiConfig.Register()'中添加'config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()'來做一個關於Json序列化的全局配置,你可以按照這個[tutorial](http: //www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing)以更好地理解它。 –

+0

問題是,通過SDK的序列化到Azure表存儲不考慮JsonProperty(「小寫」)屬性,儘管被串行化以覆蓋wire/odata。因此,雖然我可以從MY web api獲取數據,並使用尊重屬性(小寫屬性名稱),但azure表存儲中的數據仍然遵循大寫結構。 例如從客戶端throught我的web api來通過SDK中的表存儲即將進入 PROPERTYNAME(客戶端序列化) - >(網絡API反序列化)屬性名 - >(Azure Table中連載)PROPERTYNAME 只是看起來意外到IMO。 – frigon

相關問題