2012-05-03 2 views
8

Tôi đang gặp khó khăn khi hiểu cách phân tích cú pháp chuỗi JSON thành các đối tượng C# bằng Visual .NET. Nhiệm vụ là rất dễ dàng, nhưng tôi vẫn bị mất ... tôi nhận được chuỗi này:Phân tích đối tượng json

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

Và đây là đoạn code mà tôi cố gắng 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); 
     } 

tôi không biết những gì để đặt giữa '<' và '>', và từ những gì tôi đã đọc trực tuyến tôi phải tạo một lớp mới cho nó ..? Ngoài ra, làm thế nào để tôi có được đầu ra? Ví dụ sẽ hữu ích!

+0

BTW, JSON có khả năng sai nhất. Tôi nghi ngờ 'phiên bản' được cho là một số. – svick

Trả lời

8

Tạo một lớp mới mà JSON của bạn có thể được deserialized vào như:

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

Có, bạn cần một lớp mới với các thuộc tính sẽ khớp với JSON của bạn.

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

Bạn cần một Lớp khớp với JSON bạn đang nhận được và nó sẽ trả về một đối tượng mới của lớp đó với các giá trị được điền.

7

Nếu bạn đang sử dụng .NET 4 - sử dụng kiểu dữ liệu động.

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

Bạn có thể giải thích chính xác loại đó có thể được sử dụng ở đây không? Bởi vì 'Deserialize (nguồn)' sẽ không có hiệu ứng mong muốn. – svick

+0

@svick Anh ấy sẽ không thể sử dụng Deserialize . Ông có lẽ sẽ phải làm một cái gì đó giống như những gì được thảo luận ở đây http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object. Anh ta sẽ không phải tạo một lớp được đánh máy mạnh trong trường hợp đó và chỉ sử dụng đối tượng động như sau: var dynObject = parser.Deserialize (nguồn, typeof (đối tượng); Sau đó truy cập vào các thuộc tính động một cách tự động dynObject.single_token, dynObject tên người dùng, v.v. – phreak3eb

2

Cách thông thường sẽ tạo ra một lớp (hoặc một tập các lớp, để biết thêm các chuỗi JSON phức tạp) mô tả đối tượng bạn muốn deserialize và sử dụng nó như là tham số chung.

Một lựa chọn khác là để deserialize JSON thành một Dictionary<string, object>:

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

Bằng cách này, bạn có thể truy cập dữ liệu, nhưng tôi sẽ không khuyên bạn nên làm điều này trừ khi bạn phải làm vậy.

0

Tiếp theo là mã ..

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