好的,所以我使用MVC 3,它非常适合将JSON数据集反序列化为传递给我的控制器操作的强类型对象。不幸的是,我还没有找到一个更有活力的案例的解决方案。
内置的Json反序列化和类是否支持“未定义”属性集?例如,假设我有一些固定数据,如姓名和年龄,但我也想传递动态创建的评级列表,用户可以在其中输入(或选择)电影并在表格中设置评级值。
模型数据结构可能是这样的:
public class UserRatings
{
public string Name { get; set; }
public int Age { get; set; }
public Dictionary<string,int> Ratings { get; set; }
}
但假设我的Json数据集看起来像是来自javascript:
var data = { Name: name, Age: age, Ratings: rating };
评级变量是动态构造的对象,其中包含电影的名称(或id)作为键,评级为数字。在控制器动作中自然地对其进行反序列化将不会成功,因为它不理解评级到相当复杂的字典对象的映射。但是有一个通用的Json集合,我可以使用它作为中间格式吗?
我已经尝试在javascript中将Ratings对象设为Json字符串,只是发送一个字符串,但我无法找到一个“工厂”或者可以在C#中创建Json结构的东西,我可以迭代来获取数据输出。看来,课程Json
和JsonResult
在这方面并没有帮助我。基本上我如何在MVC中使用内置的Json支持来将我自己的反序列化转换为一些通用的Json集合对象?
答案 0 :(得分:4)
您可以对某些ActionFilters使用JavaScriptSerializer或DataContractSerializer。他们非常灵活
答案 1 :(得分:1)
基本上使用动态类型查看我的回答Passing dynamic json object to C# MVC controller,而ValueProviderFactory是将Json反序列化为更动态的最简洁方法。
答案 2 :(得分:0)
还有另一种选择,我更喜欢使用它来整理...(我们取消了从请求流中获取数据的步骤)
这是一个代码示例
Cat catObj = new Cat();
if (TryUpdateModel<Cat>(catObj))
{
//do stuff
}
else
{
//invalid input
}
TryUpdateModel驻留在控制器名称空间中,因此无需添加任何其他引用。
如果您只是需要将Json作为请求的一部分发送,您可以使用以下代码块获取它(您也可以从Request.Form
获取它)
using (StreamReader reader = new StreamReader(Request.InputStream))
{
var inputJson = reader.ReadToEnd();
}