2013-04-01 14 views
6

Ho creato una nuova applicazione MVC4 e, per impostazione predefinita, Newton JSON è stata aggiunta al pacchetto.Newtonsoft JSON

Ho letto che è utile per serializzare e deserializzare JSON. È tutto ciò che fa?

Per impostazione predefinita, è possibile inviare JSON in MVC utilizzando JSONResult. e usando Stringify in JQuery posso ricevere una classe in C#.

So che ci dovrebbe essere qualche ragione per cui hanno aggiunto Newton JSON.

Dato che sono nuovo di MVC e sto iniziando un nuovo progetto, desidero sapere qual è il tipo di serializzazione/deserializzazione da utilizzare?

Grazie

+0

Si tratta di prestazioni e flessibilità. Per le prestazioni, vedere http://james.newtonking.com/archive/2012/01/23/json-net-4-0-release-6-serialization-performance.aspx –

risposta

6

Hanno aggiunto Newtonsoft modo che il controller WebAPI può magicamente serializzare l'oggetto restituito. In MVC 3 che abbiamo usato per restituire il nostro oggetto in questo modo:

public ActionResult GetPerson(int id) 
{ 
    var person = _personRepo.Get(id); 
    return Json(person); 
} 

In un progetto Web API è possibile restituire persona e verrà serializzato per voi:

public Person GetPerson(int id) 
{ 
    var person = _personRepo.Get(id); 
    return person 
} 
+0

Quindi questo aggiunge funzionalità se utilizzo API else i può andare con altre opzioni? – user2067567

+0

Se stai facendo un progetto MVC, puoi ancora usare quello che sai in MVC 3 (ad esempio 'return Json (the_object)'). Se si tratta di un'API, non è necessario serializzare da solo. –

+0

Un po 'di tempo fa, ma avevo la stessa domanda, ma arrivò a una conclusione diversa. Newtonsoft.json è incluso in un MVC predefinito perché WebGrease dipende da questo, non perché WebApi potrebbe averne bisogno. – rism

0

Se il progetto era solo un progetto MVC senza WebAPI, quindi Newtonsoft.Json non è stato aggiunto per la restituzione JsonResults come JsonResult restituito da MVC utilizza il JavaScriptSerializer come qui sotto:

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

In questo caso è stato aggiunto perché WebGrease ha una dipendenza da esso. E i servizi di bundling e minification forniti da MVC in System.Web.Optimization hanno una dipendenza da WebGrease.

Quindi un'app MVC predefinita senza WebApi avrà Newtonsoft.Json installato per i servizi di raggruppamento e minificazione non WebApi.

Per essere chiari il JsonResult restituito da WebAPI in System.Web.Http non utilizzare Newtonsoft.Json per la sua serializzazione come di seguito:

using Newtonsoft.Json; 
using System; 
using System.IO; 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web.Http; 

namespace System.Web.Http.Results 
{ 
    /// <summary> 
    /// Represents an action result that returns an <see cref="F:System.Net.HttpStatusCode.OK"/> response with JSON data. 
    /// </summary> 
    /// <typeparam name="T">The type of content in the entity body.</typeparam> 
    public class JsonResult<T> : IHttpActionResult 

Ma Newtonsoft.Json non è incluso in un non WebAPI, progetto MVC solo nel caso in cui si potrebbe decidere di DEFAULT utilizzare alcuni WebApi, è lì perché, come sopra, è necessario lo WebGrease. Non sono sicuro di cosa stiano facendo in vNext, probabilmente Newtonsoft.Json.

Problemi correlati