2012-05-03 22 views
8

Tengo problemas para entender cómo analizar cadena JSON en objetos C# con Visual .NET. La tarea es muy fácil, pero todavía estoy perdido ... consigo esta cadena:Análisis de objetos json

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

y este es el código en la que trato de 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); 
     } 

no lo hago ¿Sabes qué poner entre '<' y '>', y por lo que he leído en línea tengo que crear una nueva clase para ello ..? Además, ¿cómo obtengo la salida? ¡Un ejemplo sería útil!

+0

Por cierto, el JSON es más probable mal. Dudo que 'version' se supone que es un número. – svick

Respuesta

8

Crear una nueva clase en la que JSON puede ser serializado dentro como por ejemplo:

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í, necesita una nueva clase con propiedades que coincidan con su JSON.

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

Se necesita una clase que coincide con el JSON que está recibiendo y ha de devolver un nuevo objeto de esa clase con los valores pobladas.

7

Si está utilizando .NET 4: utilice el tipo de datos dinámico.

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

¿Podría explicarnos exactamente cómo se podría usar ese tipo aquí? Porque 'Deserialize (fuente)' no tendrá el efecto deseado. – svick

+0

@svick No podría usar Deserialize . Probablemente tenga que hacer algo como lo que se discute aquí http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object. No tendría que crear una clase fuertemente tipada en ese caso y simplemente usar el objeto dinámico como: var dynObject = parser.Deserialize (source, typeof (object); Luego acceda a las propiedades dinámicamente. dynObject.single_token, dynObject .nombre de usuario, etc. – phreak3eb

2

La forma más habitual sería crear una clase (o un conjunto de clases, para más cadenas JSON complejas) que describe el objeto que desea deserializar y usarlo como el parámetro genérico.

Otra opción es deserializar el JSON en un Dictionary<string, object>:

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

De esta manera, se puede acceder a los datos, pero no sugeriría que hacer esto a menos que tenga que hacerlo.

0

A continuación se presenta el código ..

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