2012-05-03 215 views
8

我无法理解如何使用Visual .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

BTW,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他无法使用Deserialize 。他可能不得不做一些像这里讨论的东西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字符串),它描述了您想要反序列化的对象并将其用作泛型参数。

另一种选择是将反序列化JSON成Dictionary<string, object>

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

这样,您就可以访问这些数据,但是我不建议你这样做,除非你要。

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