2012-05-03 21 views
8

Visual Studio .NETでJSON文字列をC#オブジェクトに解析する方法を理解できません。タスクは非常に簡単ですが、私はまだ迷ってしまいました... 私は、この文字列を取得:jsonオブジェクトを解析する

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

そして、これは私が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); 
     } 

私はしないでください'<'と '>'の間に何を入れるべきかを知り、私がオンラインで読んだことから、新しいクラスを作成する必要があります。また、どのように出力を得るのですか? 例が役に立ちます!

+0

はところで、JSONはおそらく間違っています。 'バージョン'は数字であるはずです。 – svick

答えて

8

あなたのJSONのようなにデシリアライズすることができ、新しいクラスを作成します。クラス(またはクラスのセットを作成するだろう

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

はい、JSONと一致するプロパティを持つ新しいクラスが必要です。

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

取得しているJSONと一致するクラスが必要です。値が入力されたそのクラスの新しいオブジェクトが返されます。

7

.NET 4を使用している場合は、動的データ型を使用します。

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

ここでそのタイプをどの程度正確に使用できるか説明できますか? 'Deserialize (source)'は望ましい効果を持たないためです。 – svick

+0

@svickデシリアライズを使用することはできません。彼はおそらくここで議論されているような何かをしなければならないだろうhttp://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object。この場合、厳密に型指定されたクラスを作成する必要はなく、次のような動的オブジェクトを使用するだけです:var dynObject = parser.Deserialize(source、typeof(object); 次に動的にプロパティにアクセスしてください dynObject.single_token、dynObjectユーザー名など – phreak3eb

2

通常の方法を、より多くのため複雑なJSON文字列)を使用して、デシリアライズしてジェネリックパラメータとして使用するオブジェクトを記述します。

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

この方法で、あなたがデータにアクセスすることができますが、私はあなたがする必要がない限り、あなたがこれを行うにはお勧めしません:

別のオプションは、Dictionary<string, object>にJSONをデシリアライズすることです。

0

コードが続きます。..

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