C# 在MVC方法中接收任意JSON对象
我有一个C#view类,如下所示: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
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\"}"