2016-08-01 4 views
4

JSONのプロパティ名のドットをキー値形式に逆シリアル化しようとしています。私はinbuilt ASP.NET MVCモデルバインディングを使用しています。これは、キー値オブジェクトの代わりにオブジェクトの表記法としてドットを解釈しているようです。ドットを無視してキー値として正しくデシリアライズする方法はありますか?この形式でデータを再度出力する必要があるため、これは重要です。すべてのプロパティ名のドットでJSONを逆シリアル化する

コントローラーアクション

[HttpPost] 
public ActionResult SaveProgress(int id, ProgressVM data) 
{ 
    // ProgressVM Data property has an item with key "prop" and a null value, nothing else 
} 

ビューモデル

public class ProgressVM 
{ 
    public int ID { get; set; } 
    public Dictionary<string, string> Data { get; set; } 
} 

JSON例

{ 
    "ID": 123, 
    "Data": { 
     "prop.0.name": "value", 
     "prop.0.id": "value", 
     "prop.1.name": "value", 
     "prop.2.name": "value", 
     "prop.3.name": "value" 
    } 
} 
+0

だからどこに問題がありますか?データをckuent-serverまたはその逆に送信していますか? –

+0

クライアントからサーバーへデータを送信し、アクションメソッドでデシリアライズします。 –

+0

ドットの代わりにコンマ、ハイフン、またはセミコロンを使用するとどうなりますか? –

答えて

3

まず、POSTアクションのパラメータを渡すとき、あなたは一つのパラメータのみではなくを渡します複数。したがって、IdモデルとProgressVMモデルが含まれるモデルを作成してみてください。

ここで、デシリアライズの問題。 JsonValueProviderFactoryクラスでは、ProgressVMモデルのネストされたDictionary<string, string>をバインドしないため、何か問題があるようです。私はこのモデルのためにModelBinderを作成しようとしましたが、DictionaryValueProviderでは失敗し、Dataプロパティはバインドされていません。残念ながら、私はこれがなぜ起こっているのか調べていませんでした。それはJsonValueProviderFactoryのバグですか?私は知らないので、すぐに別の回避策に移行しました。

モデルの代わりにコントローラにJSON文字列を渡してから、コントローラの本体で入力を逆シリアル化するのはなぜですか?以下の例で ルック:

var data = { 
    "ID": 123, 
    "Data": { 
     "prop.0.name": "value", 
     "prop.0.id": "value", 
     "prop.1.name": "value", 
     "prop.2.name": "value", 
     "prop.3.name": "value" 
    } 
}; 

$.ajax({ 
    url: '@Url.Action("SaveProgress", "Home")', 
    data: { "data": JSON.stringify(data) }, 
    method: "POST" 
}); 

ASP.NET MVCコントローラのアクションに

[HttpPost] 
public ActionResult SaveProgress(string data) 
{ 
    var json = JsonConvert.DeserializeObject<ProgressVM>(data); 
    // Rest of code here 
} 

データを投稿するjQueryのAJAXを使用して

JavaScriptコードは、これはあなたの質問に答えますか?

+0

すべてのテストをお寄せいただきありがとうございます。私には似たような結果が出ているようです。 JSONを文字列として渡して、アクションでデシリアライズすると、よりうまく機能します。 –

+1

受信した応答にプロパティ名のドットが含まれている場合はどうなりますか? – Saket

関連する問題