Comment utiliser Json.NET pour JSON modelbinding dans un MVC5 projet?
J'ai été la recherche autour de l'internet pour une réponse ou un exemple, mais ne pouvait pas trouver encore. Je voudrais simplement changer la valeur par défaut sérialiseur JSON qui est utilisé pour désérialiser JSON tout modelbinding à JSON.NET de la bibliothèque.
J'ai trouvé cette DONC post, mais impossible de la mettre en œuvre jusqu'à présent, je ne peux même pas voir la System.Net.Http.Formatters
espace de noms, je ne peux voir GlobalConfiguration
.
Ce qui me manque?
Mise à JOUR
J'ai un ASP.NET projet MVC, il était essentiellement un MVC3 projet. Actuellement, je suis de mieux les cibler .NET 4.5 et à l'aide de la ASP.NET MVC 5 et liées les packages NuGet.
Je ne vois pas le Système.Web.Http assemblée, ni de toute autre espace de noms. Dans ce contexte, je tiens à injecter JSON.NET pour être utilisé comme modèle de classeur par défaut pour le format JSON type de demandes.
- GlobalConfiguration -> msdn.microsoft.com/en-us/library/...
- Oui, je l'avais vu, mais je ne peux pas ajouter une référence à System.Web.Http, car il n'est pas dans la liste de référence. Ajout de plus d'informations à ma question.
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé une réponse. Fondamentalement, je n'ai pas besoin
MediaTypeFormatter
genre de choses, qui n'est pas conçu pour être utilisé dans MVC de l'environnement, mais dans ASP.NET les Api Web, c'est pourquoi je ne vois pas ces références et les espaces de noms (par la voie, ceux qui sont inclus dans leMicrosoft.AspNet.WeApi
package NuGet).La solution est d'utiliser une valeur personnalisée fournisseur de l'usine. Voici le code nécessaire.
Et vous pouvez l'utiliser comme ceci dans votre
Application_Start
méthode:Ici est le post qui m'a indiqué la bonne direction, et également a donné une bonne explication sur la valeur des fournisseurs et modelbinders.
public ResultObject DoThis(string input)
la ligneJSONReader.Read
meurt avec une exception comme "caractère Inapproprié, le texte n'est pas JSON". Toutes les pensées?enum
valeurs par leurs valeurs entières (par exemple,{someEnum:2}
). À l'aide de laEnumModelBinder
classe à partir de ici il fixe à nouveau.J'ai eu un problème avec ce bien. J'ai été poster JSON à une action, mais mon JsonProperty noms ont été ignorés. Ainsi, mon modèle de propriétés étaient toujours vides.
Je suis annonce d'une action à l'aide de cette coutume fonction jquery:
Et je l'appelle comme ceci:
Malheureusement, seulement foo était jamais arriver lié (bizarre, depuis que l'affaire n'est pas la même, mais je suppose que le défaut modelbinder n'est pas sensible à la casse)
La solution a fini par être assez simple
J'ai juste mis en œuvre une version générique de Dejan classeur modèle qui fonctionne très bien pour moi. Il pourrait probablement utiliser certains mannequin de contrôle (comme s'assurer que la demande est en fait l'application/json), mais elle fait le truc maintenant.
Quand je veux l'utiliser sur une action spécifique, je dis simplement ce que je veux utiliser mon personnalisée Json.Net modèle de classeur au lieu:
Maintenant mon [JsonProperty(PropertyName = "")] attributs sont plus ignorés sur Monmodèle et tout est lié correctement!
Dans mon cas, j'ai eu désérialiser des objets complexes, y compris les interfaces et les chargés dynamiquement types etc. afin de fournir une valeur personnalisée fournisseur ne fonctionne pas comme MVC encore besoin, essaie de comprendre comment instancier des interfaces et puis échoue.
Que mes objets ont été déjà correctement annoté de travailler avec Json.NET j'ai pris un itinéraire différent: j'ai mis en place un modèle de liaison personnalisé et utilisé Json.NET explicitement désérialiser le corps de la requête de données comme ceci:
Le modèle de classeur est enregistré dans
Global.asax.cs
: