C# 在MVC方法中接收任意JSON对象

C# 在MVC方法中接收任意JSON对象,c#,json,asp.net-mvc,C#,Json,Asp.net Mvc,我有一个C#view类,如下所示: public class DataObject { public int Number { get; set; } public dynamic Data { get; set; } // <----- } 问题是我想在DataObject类的Data属性中接收多种类型的对象 也就是说,我希望这两个对象都可以作为有效的输入json对象 类型1 { Number: 1, Data: { Text: "a text

我有一个C#view类,如下所示:

public class DataObject
{
    public int Number { get; set; }
    public dynamic Data { get; set; } // <-----
}
问题是我想在
DataObject
类的
Data
属性中接收多种类型的对象

也就是说,我希望这两个对象都可以作为有效的输入json对象

类型1

{
   Number: 1, 
   Data: {
      Text: "a text"
   }
}
类型2

{
   Number: 2, 
   Data: {
      Value: 1,
      Options: { 1, 2, 3, 4 }
   }
}
有没有一种方法可以使用动态对象或其他类型的json库魔法来实现这一点(只是让属性动态化,什么都不做)

我所要做的就是将这些数据存储在SQL列nvarchar字段中,并在以后返回(通过实体框架)

另一种解决方案是为每种类型的输入创建一个视图模型,但由于有100种变体,因此创建所有这些视图和相应的输入方法将很难维护

根据注释请求添加更多详细信息:通过Angular调用该方法

pub.Save = function (jsonData) {
    return $http(
            {
                method: "POST",
                url: baseURL + "/Save",
                data: { request: jsonData}, // tried this for string
                // data: jsonData, // original way
                timeout: 30000
            }
        )
        .then(function (result) {
            return result.data;
        });
}

在服务器端,DTO类必须与负载承载的相同属性名匹配

public class DataObject
{
    public string test { get; set; } // <-----
}
有效负载json在对象
请求中。test
但是它已被序列化。 使用

它是如何处理多种不同类型的变量的?

将其反序列化为
动态
类型,如下所示:

dynamic obj = JsonConvert.DeserializeObject(request.test, typeof(object));

//Properties within the obj are checked at run time.
if(obj.Text != null) {
  //Do your thing
}

if(obj.Value != null) {
  //Do your thing
}

if(obj.Options != null) {
  //Do your thing
}

通过在客户端将数据转换为JSON字符串,我能够将其发送到string属性,从而能够对所有对象使用相同类型的视图

我在保存对象(我在前端使用angular)时完成了这项工作,将Json对象转换为字符串

entry.Data = angular.toJson(entryData.Data, false);
然后,当从MVC获取json字符串时,我这样做是为了将其返回到一个真正的javascript对象

entry.Data = angular.fromJson(entry.Data);
如果不先将JSON对象转换为JSON字符串,MVC将不会将其接受为文本属性

使用上述方法,我将这样的数据存储在数据库中:

"{\"Value\":123,\"Currency\":\"EUR\"}"

只需接受字符串并在以后进行转换,就可以接受任何Json字符串,对吗?仅将数据设置为字符串属性无法捕获值。它总是空的。不是整个方法输入的数据,如SaveData(string jsonstring)@Krishna试图将输入参数更改为string
public ActionResult SaveData(string request)
,但当我这样做时,request总是
null
。@JensB:这就是为什么这是一个注释而不是答案;)
entry.Data = angular.fromJson(entry.Data);
"{\"Value\":123,\"Currency\":\"EUR\"}"