MVC JsonResult CamelCase serialization [dupliquer]

cette question a déjà une réponse ici:

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?

30
demandé sur Community 2013-02-23 17:03:46

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.

13
répondu Dresel 2013-06-23 07:24:47

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);
    }
15
répondu DanKodi 2014-03-28 05:03:33