2011-03-29 53 views
2

好吧,所以我使用的是MVC 3,它非常适合将JSON数据集反序列化为传递给我的控制器操作的强类型对象。不幸的是,我还没有找到一个更具动态的解决方案。如何在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 }; 

凡等级变量是一个动态构造对象由电影的名称(或编号)作为关键字和评级编号组成。在控制器动作中自然地反序列化它将不会成功,因为它不理解评级到相当复杂的字典对象的映射。但是有没有一个通用的Json集合,我可以用它作为中间格式的评分?

我已经尝试使用JavaScript对象作为JSON字符串,只是发送一个字符串,但我无法找到一个“工厂”或可以使C#中的JSON结构的东西,我可以迭代得到数据输出。看起来在这方面JsonJsonResult并不帮助我。基本上我怎么能在MVC中使用内置的Json支持来对自己的通用Json集合对象进行反序列化?

+0

只是想评论一下,我的解决方案到目前为止是使评级为字符串类型,并在客户端上对评级对象执行JSON.stringify并将其作为一个字符串属性发送。然后它们全部直接映射到POCO中。然后剥离评级字符串中的所有转义字符,该字符串以json字符串留给我,以便JavaScriptSerialiser能够转换为Dictionary ,我可以在其中遍历它们并更新数据库。它有点混乱,但它有效。任何建议,不胜感激。 – Johncl 2011-03-30 12:31:24

+0

相关/愚弄: http://stackoverflow.com/questions/5022958/passing-dynamic-json-object-to-c-sharp-mvc-controller http:// stackoverflow。com/questions/10787679/passing-unstructured-json-between-jquery-and-mvc-controller-actions – 2013-01-07 10:14:05

回答

4

您可以使用JavaScriptSerializerDataContractSerializer与某些ActionFilters。他们是非常灵活的

+0

谢谢。 JavaScriptSerializer有一个名为DeserializeObject的方法,在我的情况下实际上创建了一个Json数据的Dictionary ,它极大地简化了整个过程!我想我希望这是内置反序列化程序的一部分,因为创建相同类型的字典不适用于所讨论的复杂属性。 – Johncl 2011-03-29 13:51:13

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(); 
} 
+0

好吧,所以这将是为了避免有一个简单的字符串属性来包含我的情况下的所有动态json数据?但我仍然需要一些方法来获得包含我的动态列表的jason块,以及如何在动作中执行此操作的任何想法? – Johncl 2011-03-30 10:55:18

+0

@Johncl:更新了答案...看一看 – Mulki 2011-03-30 11:18:01

+0

但正如你可能从我的例子中看到的,我发送了一个json对象,它包含一些应直接映射到定义良好的对象的属性的属性,以及一个属性包含一个通用名称 - 值映射。是否有一个数据类型,我可以使用该属性,将填充该属性的原始json数据? Atm我需要发送一个json编码的字符串作为一个数据类型,并在使用JavaScriptSerializer获取字典之前使用这个字符串。如果可能的话,避免使用stringified-json-hack-in-json会很好。 – Johncl 2011-03-30 12:20:02

相关问题