【问题标题】:C#/MVC Web app - Dynamic object from JSON [duplicate]C#/MVC Web 应用程序 - 来自 JSON 的动态对象 [重复]
【发布时间】: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 的定义。

对于强类型变量或接口,我从来没有遇到过这样的问题(基本上很明显......)。

如果我的帖子缺少信息,请告诉我。

感谢您的宝贵时间。

编辑:增加了关于我的问题的精确度以及我可以尝试使用此对象的异常

【问题讨论】:

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


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2017-07-14
    • 2013-05-29
    • 2020-10-29
    相关资源
    最近更新 更多