2012-05-10 11 views
5

Sono nuovo di JSON e voglio creare un semplice oggetto JSON usando StringBuilder che verrebbe interrogato da una chiamata AjQuery jQuery.Come creare un oggetto JSON semplice usando la stringa C# Builder

[WebMethod] 
public static string GetmyJSON() 
{ 
    StringBuilder sb = new StringBuilder();  
    sb.Append("{firstname: \"Manas\",").Append("lastname : \"Tunga\"").Append("}"); 
    return sb.ToString();  

} 

Nel mio codice lato client che ho:

.ajax({ 

     type: "POST", 
     url: "simplePage.aspx/GetmyJSON",   
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 

     success: function (data) { 

      alert(data.d.firstname);    


     } // end of sucess 

    }); // End of ajax 

Ma il mio messaggio di avviso mostra 'undefined' invece di 'Manas'. E 'possibile restituire un oggetto JSON usando StringBuilder?

+0

È possibile creare un oggetto .net appropriato che incapsula i dati che si desidera inviare e li fa liere in JSON tramite una libreria come JSON.Net.Se vuoi una tecnica integrata, fai qualche ricerca con DataContractSerializer – deostroll

+0

Se insisti a farlo in questo modo, ether cambia il parametro "\" 'a' ", ether cambia in' \\\ "' – Aristos

+1

Nome proprietà JSON deve essere quotato, ad esempio: '{" id ": 10}' – canon

risposta

3
var lstMes = new List<Person>(); 

      System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
      new System.Web.Script.Serialization.JavaScriptSerializer(); 
       string sJSON = oSerializer.Serialize(lstMes); 
       return sJSON; 

non dimenticate di aggiungere il riferimento a:

System.Web.Extensions.dll !! 
10

Mai farlo. Mai costruire manualmente JSON. Sempre utilizzare i serializzatori JSON. O nel tuo caso non hai nemmeno bisogno di farlo perché il runtime webmethod di ASP.NET si prenderà cura di te. Tutto ciò che devi fare è concentrarti sui tuoi requisiti aziendali e non preoccuparti delle tubature.

Così, per esempio iniziare con la definizione di un modello che rappresenterà i tuoi dati:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

e quindi avere il tuo metodo web restituire questo modello lasciando tutte le preoccupazioni di serializzazione del quadro:

[WebMethod] 
public static Person GetPerson() 
{ 
    Person p = new Person(); 
    p.FirstName = "Manas"; 
    p.LastName = "Tunga"; 
    return p; 
} 

E ora semplicemente consumare questo metodo dal client:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: '{ }', 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

No nee d di cui preoccuparsi JSON, costruttori di stringa, ...

E si potrebbe anche passare argomenti complessi per il metodo di web se avevi bisogno di:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

e poi:

[WebMethod] 
public static Person GetPerson(Foo foo) 
{ 
    ... 
} 

e infine:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: JSON.stringify({ foo: { bar: 'baz' } }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

Il metodo JSON.stringify qui illustrato è nativamente integrato nel browser moderno S. Se è necessario supportare i browser legacy, è possibile includere lo script json2.js nella pagina.

+0

Se insisto a utilizzare il generatore di stringhe per creare manualmente JSON, come faresti. Sapevo dov'era il mio errore – manas

+0

Non puoi insistere su qualcosa di sbagliato come costruire manualmente JSON usando stringhe. Ciò che è sbagliato è l'approccio che hai preso. Il fatto è che stai restituendo una stringa dal tuo metodo web. Quindi all'interno del tuo gestore di successo è necessario analizzare questa stringa su un oggetto se vuoi accedervi, come questo 'alert ($. ParseJSON (data.d) .firstname);'. Ma per favore, per favore, promettimi che non farai mai niente del genere. –

+0

@DarinDimitrov, sei abbastanza autorevole solo a crederti e a respingere i miei dubbi sulle prestazioni, ma sono ancora curioso di sapere perché è cattivo e perché non esiste una classe JsonBuilder nativa in BCL in analogia con StringBuilder, XmlWriter, HtmlTextWriter. Perché tutti quelli sono OK, ma JsonBuilder è cattivo? Diciamo che ho bisogno di creare oggetti semplici di 5 proprietà, ma alcune proprietà dovrebbero essere definite solo quando sono soddisfatte alcune condizioni. È troppo complesso definire la gerarchia dei modelli per questo caso - userò quindi il dizionario dinamico o il dizionario. Farà male le prestazioni un po '... –

0

Rispondendo rigorosamente alla domanda: sì, è possibile restituire tutto ciò che si desidera da un metodo .NET. Il tuo problema, come @canon ha detto in un commento sulla domanda, è probabilmente che devi includere i nomi delle proprietà.

che dimostra il motivo per cui la risposta "corretta" (come già accennato: 1, 2) è quello di utilizzare un serializzatore esistente come JSON.NET (se avete bisogno di serializzare manualmente) oppure lasciare gestire .NET esso (come invece accade nella maggior parte " recenti "iterazioni" restituendo l'oggetto stesso.