2012-05-03 16 views
8

Ho difficoltà a capire come analizzare la stringa JSON in oggetti C# con Visual .NET. Il compito è molto facile, ma sto ancora perso ... ottengo questa stringa:Parsing json objects

{"single_token":"842269070","username":"example123","version":1.1} 

E questo è il codice dove cerco di desterilize:

namespace _SampleProject 
{ 
    public partial class Downloader : Form 
    { 
     public Downloader(string url, bool showTags = false) 
     { 
      InitializeComponent(); 
      WebClient client = new WebClient(); 
      string jsonURL = "http://localhost/jev"; 
      source = client.DownloadString(jsonURL); 
      richTextBox1.Text = source; 
      JavaScriptSerializer parser = new JavaScriptSerializer(); 
      parser.Deserialize<???>(source); 
     } 

non lo faccio sapere cosa mettere tra il '<' e '>', e da quello che ho letto online devo creare una nuova classe per questo ..? Inoltre, come posso ottenere l'output? Un esempio sarebbe utile!

+0

BTW, il JSON è più probabile sbagliato. Dubito che 'versione' dovrebbe essere un numero. – svick

risposta

8

Creare una nuova classe che il JSON può essere deserializzato in quali:

public class UserInfo 
{ 
    public string single_token { get; set; } 
    public string username { get; set; } 
    public string version { get; set; } 
} 

public partial class Downloader : Form 
{ 
    public Downloader(string url, bool showTags = false) 
    { 
     InitializeComponent(); 
     WebClient client = new WebClient(); 
     string jsonURL = "http://localhost/jev"; 
     source = client.DownloadString(jsonURL); 
     richTextBox1.Text = source; 
     JavaScriptSerializer parser = new JavaScriptSerializer(); 
     var info = parser.Deserialize<UserInfo>(source); 

     // use deserialized info object 
    } 
} 
2

Sì, è necessaria una nuova classe con proprietà che corrispondano al JSON.

MyNewClass result = parser.Deserialize<MyNewClass>(source); 
1

è necessaria una classe che corrisponde con il JSON si stanno ottenendo e restituirà un nuovo oggetto di quella classe con i valori popolate.

7

Se si utilizza .NET 4, utilizzare il tipo di dati dinamico.

http://msdn.microsoft.com/en-us/library/dd264736.aspx

string json = "{ single_token:'842269070', username: 'example123', version:1.1}"; 

    JavaScriptSerializer jss = new JavaScriptSerializer(); 

    dynamic obj = jss.Deserialize<dynamic>(json); 

    Response.Write(obj["single_token"]); 
    Response.Write(obj["username"]); 
    Response.Write(obj["version"]); 
+1

Puoi spiegare come esattamente potrebbe essere usato quel tipo qui? Poiché 'Deserialize (source)' non avrà l'effetto desiderato. – svick

+0

@svick Non sarebbe in grado di utilizzare Deserialize . Probabilmente avrebbe dovuto fare qualcosa di simile a ciò che è discusso qui http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object. In tal caso non avrebbe dovuto creare una classe fortemente tipizzata e utilizzare l'oggetto dinamico come: var dynObject = parser.Deserialize (source, typeof (oggetto); Quindi accedere dinamicamente alle proprietà. dynObject.single_token, dynObject .nome utente, ecc. – phreak3eb

2

Il solito modo sarebbe creare una classe (o un insieme di classi, per più complesse stringhe JSON) che descrive l'oggetto da deserializzare e lo usa come parametro generico.

Un'altra opzione è quella di deserializzare il JSON in un Dictionary<string, object>:

parser.Deserialize<Dictionary<string, object>>(source); 

questo modo, è possibile accedere ai dati, ma non vorrei suggerire di fare questo a meno che non si deve.

0

seguito riporta il codice ..

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); 

     request = WebRequest.Create("https://myipaddress/api/admin/configuration/v1/conference/1/"); 

     request.Credentials = new NetworkCredential("admin", "admin123"); 
     // Create POST data and convert it to a byte array. 
     request.Method = "GET";   

       // Set the ContentType property of the WebRequest. 
     request.ContentType = "application/json; charset=utf-8";   


     WebResponse response = request.GetResponse(); 
     // Display the status. 
     Console.WriteLine(((HttpWebResponse)response).StatusDescription); 
     // Get the stream containing content returned by the server. 
     dataStream = response.GetResponseStream(); 
     // Open the stream using a StreamReader for easy access. 
     StreamReader reader = new StreamReader(dataStream); 
     // Read the content. 
     string responseFromServer = reader.ReadToEnd(); 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     var obj = js.Deserialize<dynamic>(responseFromServer); 
     Label1.Text = obj["name"]; 
     // Display the content. 
     Console.WriteLine(responseFromServer); 
     // Clean up the streams. 
     reader.Close(); 
     dataStream.Close(); 
     response.Close();