使用Web API在Azure表存儲中返回數據。我返回一個類,我在一個類中繼承TableEntity並添加屬性,但希望保留大寫屬性名稱的.Net約定,但也要遵守小寫屬性名稱的JavaScript/json約定。Azure表中的TableEntity中的序列化屬性存儲
我已經嘗試將Json.net屬性屬性添加到類,但它似乎被忽略。例如爲:
[JsonProperty( 「ID」)] 公共字符串ID {得到;集;}
如果實例對ID設置的值,零是表示在序列化結果。
使用Web API在Azure表存儲中返回數據。我返回一個類,我在一個類中繼承TableEntity並添加屬性,但希望保留大寫屬性名稱的.Net約定,但也要遵守小寫屬性名稱的JavaScript/json約定。Azure表中的TableEntity中的序列化屬性存儲
我已經嘗試將Json.net屬性屬性添加到類,但它似乎被忽略。例如爲:
[JsonProperty( 「ID」)] 公共字符串ID {得到;集;}
如果實例對ID設置的值,零是表示在序列化結果。
僅供參考 - 雖然這並沒有回答如何讓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"];
}
根據你的描述,我在我身邊測試了這個問題,發現它適合我和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),請嘗試升級到最新版本並再次運行您的應用程序,以確定它是否可以按預期工作。
嗯,我想我可以返回類型更改爲字符串,但因爲其他內部操作直接調用的函數,如果喜歡它返回的對象,在你的榜樣重新運行用戶,以避免deserilaization在額外開銷那些調用它的函數。 – frigon
根據你的評論,我改變了'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)以更好地理解它。 –
問題是,通過SDK的序列化到Azure表存儲不考慮JsonProperty(「小寫」)屬性,儘管被串行化以覆蓋wire/odata。因此,雖然我可以從MY web api獲取數據,並使用尊重屬性(小寫屬性名稱),但azure表存儲中的數據仍然遵循大寫結構。 例如從客戶端throught我的web api來通過SDK中的表存儲即將進入 PROPERTYNAME(客戶端序列化) - >(網絡API反序列化)屬性名 - >(Azure Table中連載)PROPERTYNAME 只是看起來意外到IMO。 – frigon