2017-05-09 1 views
0

J'ai regardé sur Internet mais n'ai pas trouvé quelque chose qui se rapporte à mon problème.C#/MVC Web app - Objet dynamique de JSON

J'ai visual studio 2017. Travailler dans 4.6.1. NET Framework. L'application est une application asp.net MVC 4 (standard).

J'ai un controleur Dataset:

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); 
    } 
} 

Le client peut pousser tout type de données qu'il veut. Je vais gérer la structure de l'objet dynamique. J'ai essayé de passer au type IDictionary. Mais l'objet sub obtient toujours la valeur {object} value ...

Voici le JSON envoyé (avec le type de contenu application/json) via Postman.

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

Mon problème est que je ne sais pas comment faire face à ce genre d'objet. Comment puis-je récupérer des informations? Je ne peux pas appeler:

var test = data.ApplicationName 

Il lancera un RuntimeBinderException avec le message « objet » ne contient pas une définition pour ApplicationName.

Avec des variables ou des interfaces fortement typées je n'ai jamais rencontré un tel problème (bassement évident ...).

S'il vous plaît dites-moi si mon poste manque d'informations.

Nous vous remercions de votre temps.

EDIT: Ajout precisions au sujet de mon problème et l'exception que je pourrais me essayer de travailler avec cet objet

+1

vérification http: // stackoverflow. com/A/17050505/2810015 si elle a résolu votre problème. –

+1

Je travaille. Répondre à ma question en citant votre message. –

Répondre

1

Comme commentaire Nimish sur la question. Voici un post répondant à mon problème: Passing dynamic json object to C# MVC controller

Le problème provient du sérialiseur Json.Net qui n'est pas utilisé par défaut par le sérialiseur du contrôleur. Nous créons donc fournisseur de valeur

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); 
    } 
} 

créer ensuite un wrapper pour typer le paramètre:

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

mise à jour Ensuite, la méthode Push:

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