JSON e .Net Framework 2.0

18 ottobre 2010

Nonostante il .Net Framework sia in continua evoluzione, può sicuramente capitarci di dover lavorare con una versione che non sia proprio l’ultima, il cliente richiede particolari specifiche che viaggiano in concomitanza con l’evolversi del web 2.0 ed allo stesso tempo ci impone delle restrizioni, a quel punto il nostro compito non è solo quello di sviluppare il progetto ma, prima ancora, scegliere le specifiche con cui realizzarlo, le tecnologie a supporto di cui si può usufruire realizzando cosi la nostra cassetta degli strumenti personalizzata.

Un esempio pratico può essere Ajax, questa tecnologia riscuote successo da pochi anni a questa parte (soprattutto da quando c’è stato l’avvento del Web 2.0) e prendendo ad esempio il .Net Framework 2.0 possiamo facilmente capire che a quel tempo, l’idea che questa tecnologia potesse avere successo non era stata prevista data la totale mancanza di strumenti di supporto per gestirla (problema totalmente risolto a partire dalle versioni successive del framework). In questo senso ci vengono in aiuto librerie esterne che possono agevolarci di molto il lavoro che dobbiamo fare.

Oggi vi parlo di Json.NET – James Newton-King, un prodotto validissimo per l’elaborazione di dati lato Server in formato JSON, sono arrivato a tale soluzione partendo dalle mie necessità principali, cioè la completa compatibilità con il .Net Framework 2.0, la possibilità di mappare oggetti molto facilmente e soprattutto una buona documentazione (nessun prodotto è totalmente buono se non è accompagnato da una documentazione altrettanto soddisfacente!).

Dal sito ufficiale è possibile scaricare la libreria in base alla versione del Framework che si deve utilizzare, per il .Net 2.0 ho utilizzato Newtonsoft.Json.Net20.dll.

L’uso è molto semplice, basta referenziare la libreria all’interno del proprio progetto e tramite using è possibile richiamarla per poterne sfruttare le funzionalità. L’esigenza di utilizzare questa libreria è nata da un preciso problema, ho un oggetto molto complesso formato da diverse Proprietà pubbliche, di queste alcune sono calcolate, mentre altre sono dati veri e propri, il mio obiettivo è implementare una comunicazione Client (Web Browser) / Server di questo tipo:

JSON-SERVER-TO-CLIENT

In pratica voglio che un oggetto che sul server è mappato e contiene X proprietà, quando viene inviato al client come risposta JSON ad una richiesta AJAX, contenga un numero di proprietà diverso, numero che varia in base ai campi, dello stesso, che decidiamo di inviare. Nello schema si può notare come, tramite conversione, voglio che la Property 2 non arrivi nella risposta Ajax. Con la libreria Json.Net questa operazione diventa molto semplice! Prima di tutto dobbiamo creare il nostro OBJECT facendo attenzione alle specifiche di ogni proprietà:

using System; 
using Newtonsoft.Json;

namespace MyApplication.Data 
{ 
    public class MyObject
    {
    	  public int Property1; 
    	  [JsonIgnore]
    	  public int Property2; 
    	  public int Property3; 
    }
}

[ad#ad-lungo]

Il codice è molto chiaro, ho specificato un attributo per la Property2 che si chiama JsonIgnore e serve appunto per fare in modo che durante la conversione dei dati, questa proprietà non venga mappata. Comportamenti del genere sono molto frequenti se gli oggetti con cui abbiamo a che fare sono collegati tra di loro, analizziamo un oggetto più complesso per capire ancor meglio come intervenire:

JSON-SERVER-TO-CLIENT-2

In questo caso vogliamo fornire in Output le informazioni sull’utente, di questo i Ruoli non vogliamo che siano visualizzati per una particolare specifica.  Risulta utile mappare l’oggetto e specificare l’attributo perché se da un lato è semplice, dall’altro offre anche un codice auto-documentato in cui è facile intuire che si sono applicate determinate regole per una particolare esigenza. Supponendo di avere una Lista di ruoli all’interno del nostro oggetto utente, applicare la modifica risulterà molto semplice:

...
[JsonIgnore]
public List Ruoli 
{
    get { ... }
    set { ... }
}

In contesti ancor più ampi l’uso di tali pratiche durante la progettazione dei nostri oggetti risulta molto utile per un risultato finale di qualità, per esperienza diretta posso assicurarvi che quando la logica è davvero molto complessa ed i nostri oggetti espongono proprietà al cui interno si racchiudono particolari logiche che richiedono svariate risorse (es. Sql Server), sfruttare gli attributi in questo modo ci permette di ridurre drasticamente la stessa elaborazione dei dati e delle richieste.

jQuery & JSON – intercettare errori di chiamata.

10 settembre 2010

Una interessantissima feature che mi ritrovo spesso ad utilizzare nello sviluppo di web-application sono le chiamate JSON a servizi web (di qualsiasi tipo). La parte interessante di queste funzionalità è la possibilità di poter convertire, per esempio, oggetti realizzati in C#, in oggetti Java Script le cui caratteristiche sono equivalenti, ottenendo in questo modo una comunicazione diretta tra Server e Client condividendo oggetti. 

JSON è l’acronimo di Java Script Object Notation, ed è un formato adatto per lo scambio di dati in applicazioni client-server, è basato sul linguaggio Java Script ma ne è completamente indipendente e viene spesso utilizzato nelle richieste AJAX come alternativa a XML/XSLT. Si è diffuso sin da subito grazie alle sue caratteristiche principali quali semplicità di utilizzo è velocità, infatti grazie alla funzione eval() è in grado di effettuare il parsing di dati molto velocemente.

jQuery non poteva fare altro che implementare questa caratteristica all’interno del suo framework. Il tutto è stato reso possibile inserendo un metodo jQuery.getJSON(url, data, callbackFunction) che permette di effettuare chiamate di questo tipo. Questa metodo delle volte non è molto comodo, infatti durante lo sviluppo, partendo dal presupposto che nessuno è perfetto, si possono commettere degli errori in fase di scrittura del codice arrivando cosi a creare richieste JSON non correttamente generate (capita… mi è capitato… mi capiterà ancora), come fare in questo caso?

Vorrei farvi notare una cosa: la funzione jQuery.getJSON() accetta in input una funzione, callbackFunction, questa viene invocata solo quando il parsing dei dati JSON viene effettuato correttamente, in caso contrario non riceveremo mai nessuna risposta.

Come possiamo intervenire per intercettare gli errori e ricevere un avviso evitando di impazzire se non riusciamo a capire il motivo per cui le nostre chiamate non vengono completate? Molto semplicemente: sulla documentazione ufficiale del metodo, viene mostrata la funzione equivalente, cioè quella da cui in pratica deriva:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Il metodo JSON infatti non è altro che una diversa implementazione della chiamata AJAX, noi possiamo intervenire direttamente da codice e creare la nostra personale implementazione del metodo aggiungendo diversi parametri utili durante lo sviluppo:

jQuery.makeAjaxCall = function(ajaxUrl, functionSuccess, functionFailure) {
    $.ajax({
        type: "GET",
        url: ajaxUrl,
        contentType: "application/json; charset=utf-8",
        data: {},
        dataType: "json",
        success: functionSuccess,
        error: functionFailure
    });
}

In questo esempio ho creato una funzione, chiamata makeAjaxCall, che accetta in ingresso diversi parametri:

  1. ajaxUrl: url del servizio web a cui connettersi per reperire i dati
  2. functionSuccess: funzione a cui fare riferimento nel caso in cui la chiamata viene completata correttamente
  3. functionFailure: funzione a cui fare riferimento nel caso in cui la chiamata non viene completata

Se ne ricava un importante risultato: ora, siamo in grado di intercettare possibili errori nelle chiamata sapendo che il problema è direttamente riconducibile ad una incorretta generazione dei nostri dati in formato JSON.