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

Web API 在 MVC 中存储承载令牌的位置

使用 JSON Sanitizer 清理来自 Spring MVC 控制器的响应 JSON?

在目标 c 数组上解析 web 服务的 JSON

来自 Json 的 Jquery 自动完成值