2016-08-01 122 views
4

我正在尝试将属性名称中的点反转JSON反序列化为键值格式。我正在使用内置的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字符串赋给控制器而不是模型,然后在控制器的主体中反序列化输入? 请看下面的例子:

JavaScript代码,使用jQuery AJAX发布数据

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 
} 

这是回答你的问题?

+0

感谢您的测试,看起来您对我的结果相似。将JSON作为字符串传递并在动作中反序列化肯定会更好。 –

+1

如果我们收到的回复在属性名称中有一个点,该怎么办? – Saket

相关问题