我试图将属性名称中的点反序列化为一个键值格式的JSON。我正在使用内置的ASP.NET MVC模型绑定。它似乎将点解释为对象符号而不仅仅是键值对象。有没有办法让它正确地反序列化作为忽略点的关键值?这很重要,因为需要以这种格式再次输出数据。
控制器操作
[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 :(得分:5)
首先,在POST
动作中传递参数时,只传递一个参数而不是多个参数。因此,尝试创建一个包含Id和ProgressVM模型的模型。
现在,针对反序列化的问题。 JsonValueProviderFactory类似乎有些错误,因为它没有绑定来自Dictionary<string, string>
模型的嵌套ProgressVM
。我知道,因为我尝试为此模型创建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
}
这是回答你的问题吗?
答案 1 :(得分:3)
我来这里是为了寻找一种将json字符串反序列化为模型的方法,尽管这里的问题通过MVC框架得以解决,但并没有解决我的问题。
给出
的json字符串{
"Property.Something": "The value"
}
我发现使用[JsonProperty]属性可以将字符串反序列化为模型,如下所示:
public class JsonModel
{
[JsonProperty(PropertyName = "Property.Something")]
public string PropertySomething {get; set;}
}