2012-05-03 9 views
8

Mam problem ze zrozumieniem, jak analizować ciąg JSON na obiekty C# za pomocą Visual .NET. Zadanie jest bardzo proste, ale nadal jestem zagubiony ... mam ten ciąg:Parsowanie obiektów json

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

I jest to kod, gdzie staram się 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); 
     } 

nie mam wiesz, co umieścić między "<" i ">", a z tego, co przeczytałem online, muszę stworzyć dla nich nową klasę ...? Ponadto, jak uzyskać dane wyjściowe? Przykład może być pomocny!

+0

BTW, JSON jest najprawdopodobniej źle. Wątpię, żeby 'version' miała być liczbą. – svick

Odpowiedz

8

utworzyć nową klasę, że JSON można rozszeregować do takich jak:

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

Tak, potrzebujesz nowej klasy o właściwościach, które będą pasować do Twojego JSON.

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

Musisz klasy, które odpowiadają z JSON otrzymujesz i powróci nowy obiekt tej klasy z wartościami zaludnionych.

7

Jeśli używasz .NET 4 - użyj dynamicznego typu danych.

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

Czy mógłbyś wyjaśnić, jak dokładnie można użyć tego typu? Ponieważ 'Deserialize (source)' nie przyniesie pożądanego efektu. – svick

+0

@svick Nie byłby w stanie użyć narzędzia Deserialize . Prawdopodobnie musiałby zrobić coś takiego, o czym tutaj mowa: http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object. W takim przypadku nie musiałby tworzyć silnie typowanej klasy i po prostu używał dynamicznego obiektu takiego jak: var dynObject = parser.Deserialize (source, typeof (object); Następnie uzyskaj dostęp do właściwości dynamicznie dynObject.single_token, dynObject .username, itp. – phreak3eb

2

zwykły sposób byłoby utworzyć klasę (lub zestaw klas, dla bardziej złożone ciągi JSON), które opisują obiekt, który ma zostać przekształcony w postać wielowątkową i używają go jako parametru ogólnego.

Inną opcją jest deserializować JSON do Dictionary<string, object>:

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

W ten sposób można uzyskać dostęp do danych, ale nie sugerują, aby to zrobić, chyba że masz do.

0

Poniżej znajduje się kod ..

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