【问题标题】:How to get a dynamically created Json data set in MVC 3 controller?如何在 MVC 3 控制器中获取动态创建的 Json 数据集?
【发布时间】:2011-07-25 07:05:03
【问题描述】:

好的,所以我使用的是 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 };

其中 rating 变量是一个动态构造的对象,由作为 key 的电影的名称(或 id)和作为数字的 rating 组成。在控制器操作中对此的反序列化自然不会成功,因为它不理解 Ratings 到相当复杂的字典对象的映射。但是是否有一个通用的 Json 集合可以用来代替 Ratings 作为中间格式?

我尝试在 javascript 中将 Ratings 对象设置为 Json 字符串,然后只发送一个字符串,但我找不到“工厂”或可以在 C# 中创建 Json 结构的东西,我可以通过迭代来获得数据出来。在这方面,Json 和 JsonResult 类似乎对我没有帮助。基本上如何使用 MVC 中内置的 Json 支持将我自己的反序列化为一些通用的 Json 集合对象?

【问题讨论】:

  • 只是想评论一下,到目前为止,我的解决方案是将 Ratings 设为字符串类型,并在客户端上对评级对象执行 JSON.stringify 并将其作为一个字符串属性发送。然后它们都直接映射到 POCO。然后,我去掉评级字符串的所有转义字符,留下一个 json 字符串,JavaScriptSerialiser 能够将其转换为 Dictionary ,我可以在其中迭代它们并更新数据库。它有点乱,但它的工作原理。非常感谢任何建议。

标签: c# javascript asp.net-mvc json


【解决方案1】:

查看我的回答Passing dynamic json object to C# MVC controller 基本上使用动态类型,而 ValueProviderFactory 是将 Json 反序列化为更动态的最干净的方法。

【讨论】:

    【解决方案2】:

    为了更整洁,我更喜欢使用另一个选项...(我们消除了从请求流中获取数据的步骤)

    这是一个代码示例

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

    【讨论】:

    • 好的,所以这是为了避免在我的情况下使用简单的字符串属性来包含所有动态 json 数据?但是我仍然需要一些方法来获取包含我的动态列表的 jason 块,知道如何在操作中执行此操作吗?
    • 但正如您可能从我的示例中看到的那样,我正在发送一个 json 对象,其中包含一些应该直接映射到定义明确的对象的属性的属性,以及一个包含通用名称-值的属性地图。是否有我可以在该属性上使用的数据类型,该数据类型将填充来自该属性的原始 json 数据? Atm 我需要发送一个 json 编码的字符串作为一种数据类型,并在使用 JavaScriptSerializer 从中获取字典之前取消转义该字符串。如果可能的话,最好避免这个 stringified-json-hack-in-json。
    • @Johncl - 你可以使用 Dictionay 让它看起来更整洁......但请记住它使用反射并且反射代码可能更慢......
    【解决方案3】:

    您可以将JavaScriptSerializer 或DataContractSerializer 与一些ActionFilters 一起使用。它们非常灵活

    【讨论】:

    • 谢谢。 JavaScriptSerializer 有一个名为 DeserializeObject 的方法,在我的例子中,它实际上创建了 Json 数据的 Dictionary ,大大简化了整个过程!我想我希望这成为内置反序列化程序的一部分,因为创建相同类型的字典不适用于相关的复杂属性。
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2015-04-30
    • 1970-01-01
    • 2013-04-26
    • 2013-12-17
    相关资源
    最近更新 更多