2017-05-09 54 views
0

我一直在寻找互联网,但没有发现与我的问题有关的东西。C#/ MVC Web应用程序 - 来自JSON的动态对象

我有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类型。但子对象仍然得到{对象}价值的东西...

这是通过邮递员发送的JSON(内容类型为application/json)。

{ 
    data: { 
    ApplicationName: "test", 
    TestObject: { 
     Name:"TestObject", 
     TestInt: 42 
    } 
    } 
} 

我的问题是我不知道如何处理这种对象。我如何从中检索信息?我不能拨打电话:

var test = data.ApplicationName 

它会抛出一个RuntimeBinderException异常,消息“object”不包含ApplicationName的定义。

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

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

谢谢你的时间。

编辑:我的问题和异常增加精度我能得到试图与该对象

+1

检查HTTP://计算器。 com/a/17050505/2810015如果它解决了您的问题。 –

+1

我工作。回答我的问题,引用您的帖子。 –

回答

1

关于这一问题的Nimish评论工作。这里是回答我的问题的帖子: Passing dynamic json object to C# MVC controller

问题来自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); 
    } 
} 

然后创建一个包装,以强类型的参数:

public class JsonDynamicWrapper 
{ 
    /// <summary> 
    /// Dynamic json obj will be in payload. 
    /// 
    /// Send to server like: 
    /// 
    /// { payload: data } 
    /// </summary> 
    public dynamic payload { get; set; } 
} 

然后更新推送方法:

[System.Web.Http.HttpPost] 
public JsonResult Push(JsonDynamicWrapper data) 
{ 
    try 
    { 
     var test = data.payload.ApplicationName; 
    } 
    catch(Exception ex) 
    { 
    } 
    return Json(null); 
} 
相关问题