C#/MVC Web 应用程序 - 来自 JSON 的动态对象 [重复]
Posted
技术标签:
【中文标题】C#/MVC Web 应用程序 - 来自 JSON 的动态对象 [重复]【英文标题】:C#/MVC Web app - Dynamic object from JSON [duplicate] 【发布时间】:2017-10-07 14:34:28 【问题描述】:我一直在互联网上查找,但没有找到与我的问题相关的内容。
我有 Visual Studio 2017。在 4.6.1 .NET 框架中工作。该应用程序是一个 asp.net MVC 4 应用程序(标准)。
我有一个控制器数据集:
public class DatasetController : Controller
[System.Web.Http.HttpPost]
public JsonResult Push(dynamic data)
try
//here data has a value of object and is object typed
catch(Exception ex)
return Json(null);
客户端可以推送他想要的任何类型的数据。我将处理来自动态对象的结构。 我试图切换到 IDictionary 类型。但是子对象仍然得到 object 值的东西...
这是通过 Postman 发送的 JSON(内容类型为 application/json)。
data:
ApplicationName: "test",
TestObject:
Name:"TestObject",
TestInt: 42
我的问题是我不知道如何处理这种对象。如何从中检索信息?我不能打电话:
var test = data.ApplicationName
它会抛出一个 RuntimeBinderException 消息“对象”不包含 ApplicationName 的定义。
对于强类型变量或接口,我从来没有遇到过这样的问题(基本上很明显......)。
如果我的帖子缺少信息,请告诉我。
感谢您的宝贵时间。
编辑:增加了关于我的问题的精确度以及我可以尝试使用此对象的异常
【问题讨论】:
检查***.com/a/17050505/2810015是否解决了您的问题。 我工作。引用您的帖子回答我的问题。 【参考方案1】:作为 Nimish 对问题的评论。这是回答我的问题的帖子: Passing dynamic json object to C# MVC controller
问题来自控制器序列化程序默认未使用的 Json.Net 序列化程序。所以我们创造价值提供者
public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
if (controllerContext == null)
throw new ArgumentNullException("controllerContext");
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
return null;
var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
var bodyText = reader.ReadToEnd();
return String.IsNullOrEmpty(bodyText) ? null : new DictionaryValueProvider<object>(JsonConvert.DeserializeObject<ExpandoObject>(bodyText, new ExpandoObjectConverter()), CultureInfo.CurrentCulture);
然后创建一个 Wrapper 以强类型化参数:
public class JsonDynamicWrapper
/// <summary>
/// Dynamic json obj will be in payload.
///
/// Send to server like:
///
/// payload: data
/// </summary>
public dynamic payload get; set;
然后更新 Push 方法:
[System.Web.Http.HttpPost]
public JsonResult Push(JsonDynamicWrapper data)
try
var test = data.payload.ApplicationName;
catch(Exception ex)
return Json(null);
【讨论】:
以上是关于C#/MVC Web 应用程序 - 来自 JSON 的动态对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
反序列化 Json usinc C#, web api, asp.net mvc
如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON