MVC JsonResult CamelCase serialization [dupliquer]
cette question a déjà une réponse ici:
- Bon sérialisation JSON dans MVC 4 3 réponses
j'essaie de faire de mon action return un JsonResult où toutes ses propriétés sont en camelCase.
j'ai un modèle simple:
public class MyModel
{
public int SomeInteger { get; set; }
public string SomeString { get; set; }
}
et une simple action de contrôleur:
public JsonResult Index()
{
MyModel model = new MyModel();
model.SomeInteger = 1;
model.SomeString = "SomeString";
return Json(model, JsonRequestBehavior.AllowGet);
}
appelant cette méthode d'action renvoie maintenant un JsonResult contenant les données suivantes:
{"SomeInteger":1,"SomeString":"SomeString"}
pour mon usage j'ai besoin de l'action retourner les données dans camelCase, d'une façon ou d'une autre comme ceci:
{"someInteger":1,"someString":"SomeString"}
y a-t-il une façon élégante de faire cela?
je cherchais des solutions possibles ici et j'ai trouvé MVC3 JSON Serialization: Comment contrôler les noms des propriétés? où ils ont fixé les définitions de DataMember à chaque propriété du modèle, mais je ne veux pas vraiment le faire.
aussi j'ai trouvé un lien où ils disent qu'il est possible de résoudre exactement ce genre de question: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing .
pour écrire les noms de propriétés JSON avec boîtier de chameau, sans changer votre modèle de données, définir le CamelCasePropertyNamesContractResolver sur le serializer:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
une entrée sur ce blog http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api / mentionne également cette solution et indique que vous pouvez simplement l'ajouter à la RouteConfig.Enregistrez pour corriger cette question. Je l'ai essayé, mais je ne pouvais pas le faire fonctionner.
avez-vous une idée d'où je faisais quelque chose de mal?
2 réponses
les fonctions Json du contrôleur ne sont que des wrappers pour créer des résultats JSON:
protected internal JsonResult Json(object data)
{
return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}
protected internal JsonResult Json(object data, string contentType)
{
return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
{
return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
}
protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
{
return Json(data, null /* contentType */, null /* contentEncoding */, behavior);
}
protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
{
return Json(data, contentType, null /* contentEncoding */, behavior);
}
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
JsonResult utilise en interne JavaScriptSerializer, de sorte que vous n'avez pas de contrôle sur le processus de sérialisation:
public class JsonResult : ActionResult
{
public JsonResult()
{
JsonRequestBehavior = JsonRequestBehavior.DenyGet;
}
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public object Data { get; set; }
public JsonRequestBehavior JsonRequestBehavior { get; set; }
/// <summary>
/// When set MaxJsonLength passed to the JavaScriptSerializer.
/// </summary>
public int? MaxJsonLength { get; set; }
/// <summary>
/// When set RecursionLimit passed to the JavaScriptSerializer.
/// </summary>
public int? RecursionLimit { get; set; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
}
HttpResponseBase response = context.HttpContext.Response;
if (!String.IsNullOrEmpty(ContentType))
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/json";
}
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
serializer.MaxJsonLength = MaxJsonLength.Value;
}
if (RecursionLimit.HasValue)
{
serializer.RecursionLimit = RecursionLimit.Value;
}
response.Write(serializer.Serialize(Data));
}
}
}
vous devez créer votre propre JsonResult et écrire vos propres fonctions de contrôleur Json (si vous en avez besoin / si vous le voulez). Vous pouvez en créer de nouveaux ou en réécrire les existants, cela dépend de vous. Ce lien pourrait aussi vous intéresser.
si vous voulez retourner une chaîne json de votre action qui adhère à la notation camelcase, ce que vous devez faire est de créer une instance JsonSerializerSettings et de la passer comme second paramètre de JsonConvert.Méthode SerializeObject (a,b).
public string GetSerializedCourseVms()
{
var courses = new[]
{
new CourseVm{Number = "CREA101", Name = "Care of Magical Creatures", Instructor ="Rubeus Hagrid"},
new CourseVm{Number = "DARK502", Name = "Defence against dark arts", Instructor ="Severus Snape"},
new CourseVm{Number = "TRAN201", Name = "Transfiguration", Instructor ="Minerva McGonal"}
};
var camelCaseFormatter = new JsonSerializerSettings();
camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
return JsonConvert.SerializeObject(courses, camelCaseFormatter);
}