2017-05-09 60 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); 
} 
相關問題