2016-09-17 14 views
0

空白テーブルストレージ内のデータを返すためにWeb APIを使用しています。私はクラス内でTableEntityを継承し、プロパティを追加していますが、大文字のプロパティ名の.Net規約に従いますが、小文字のプロパティ名のJavaScript/json規約に従いたいクラスを返します。Azureテーブルストレージ内のTableEntityのシリアライズ属性

私はクラスにJson.netプロパティ属性を追加しようとしましたが、無視されるようです。例えば:

[JsonProperty( "ID")] パブリック文字列ID {取得;セット;}インスタンスIDに設定された値を有する場合

は、NULLがシリアル化された結果で表しています。

答えて

0

FYI - これは、JSON.netの属性を尊重するためにTableEntityを取得する方法の直接の回答には答えません...継承されたクラスのReadEntityメソッドとWriteEntityメソッドをオーバーライドすることによってユースケースを解決できました:

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でうまく動作することを発見しました。ここに私の詳細な手順があります。それを参照することができます。

// 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; 
} 

エンティティ

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機能付きのWeb APIアプリケーションでUserInfoControllerという名前のコントローラを作成します。 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のシリアライゼーションに関するグローバル設定を行うことができます。このチュートリアル(http: //www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing)を参照してください。 –

+0

問題は、SDKを使用したシリアル化TO Azureテーブルストレージが、ワイヤ/オデータを経由するようにシリアル化されているにもかかわらず、JsonProperty( "小文字")属性を尊重しないことです。だから私は、属性(小文字のプロパティ名)を尊重して私のWeb APIからデータを取得することができますが、灰色のテーブルストレージのデータはまだ大文字の構造に従います。>(ウェブAPIはdeserialzed)PropertyName意味 - - ただ、予想外のようです>(Azureテーブルシリアル化された) をpropertyNameのSDKを経由して、テーブルのストレージに私のWeb API throughtクライアントから来る例えば は propertyNameの(クライアントシリアライズされたが)行きますIMOに – frigon

関連する問題