使用属性名称

时间:2016-08-01 01:30:00

标签: c# json asp.net-mvc

我试图将属性名称中的点反序列化为一个键值格式的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"
    }
}

2 个答案:

答案 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;}
}