Utilisation JSON.NET pour retourner ActionResult [dupliquer]

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

j'essaie d'écrire une méthode C# qui sérialisera un modèle et retournera un résultat JSON. Voici mon code:

    public ActionResult Read([DataSourceRequest] DataSourceRequest request)
    {
        var items = db.Words.Take(1).ToList();
        JsonSerializerSettings jsSettings = new JsonSerializerSettings();
        jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        var converted = JsonConvert.SerializeObject(items, null, jsSettings);
        return Json(converted, JsonRequestBehavior.AllowGet);
    }

j'ai eu le résultat suivant JSON quand je aller à Mots / lire dans Chrome:

"[{"WordId":1,"Rank":1,"PartOfSpeech":"article","Image":"Upload/29/1/Capture1.PNG","FrequencyNumber":"22038615","Article":null,"ClarificationText":null,"WordName":"the | article","MasterId":0,"SoundFileUrl":"/UploadSound/7fd752a6-97ef-4a99-b324-a160295b8ac4/1/sixty_vocab_click_button.mp3","LangId":1,"CatId":null,"IsActive":false}

je pense que les guillemets " échappés sont un problème qui se produit lorsque vous doublez la sérialisation d'un objet. D'autres questions: sortie WCF JSON reçoit des citations indésirables & antislashs ajoutés

il semble certainement que je suis double serializing mon objet, depuis que je serialize d'abord en utilisant JSON.NET et ensuite passer mon résultat dans la fonction Json (). J'ai besoin de sérialiser manuellement pour éviter référencelop, mais je pense que mon point de vue a besoin D'un Résultatd'action.

comment rendre un résultat d'action ici? Dois-je ou puis-je retourner une chaîne de caractères?

44
demandé sur Community 2014-04-28 22:11:41

2 réponses

au lieu de sérialiser en utilisant JSON.NET et puis en appelant Json() , pourquoi ne pas remplacer la méthode Json() dans votre contrôleur (ou peut-être un contrôleur de base pour améliorer sa réutilisation)?

C'est tiré de ce blog post .

dans votre contrôleur (ou contrôleur de base):

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonNetResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

et la définition de JsonNetResult:

public class JsonNetResult : JsonResult
{
    public JsonNetResult()
    {
        Settings = new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
    }

    public JsonSerializerSettings Settings { get; private set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");
        if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            throw new InvalidOperationException("JSON GET is not allowed");

        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;

        if (this.ContentEncoding != null)
            response.ContentEncoding = this.ContentEncoding;
        if (this.Data == null)
            return;

        var scriptSerializer = JsonSerializer.Create(this.Settings);

        using (var sw = new StringWriter())
        {
            scriptSerializer.Serialize(sw, this.Data);
            response.Write(sw.ToString());
        }
    }
}

par en faisant cela, lorsque vous appelez Json() dans votre controller, vous obtiendrez automatiquement JSON.NET vous voulez des serialisations.

62
répondu Sven Grosen 2015-02-18 18:41:48