2011-03-31 103 views
26

我將反序列化的json文件的結構如下所示;使用JavaScriptSerializer反序列化JSON文件()

{ 
    "id" : "1lad07", 
    "text" : "test", 
    "url" : "http:\/\/twitpic.com\/1lacuz", 
    "width" : 220, 
    "height" : 84, 
    "size" : 8722, 
    "type" : "png", 
    "timestamp" : "Wed, 05 May 2010 16:11:48 +0000", 
    "user" : { 
     "id" : 12345, 
     "screen_name" : "twitpicuser" 
    } 
} 

我已經創建了一個具有作爲JavaScriptSerializer屬性提交的名稱的類。我將用於反序列化json的代碼如下:

  using (var reader = new StreamReader(twitpicResponse.GetResponseStream())) { 


       var responseBody = reader.ReadToEnd(); 
       var deserializer = new JavaScriptSerializer(); 
       var results = deserializer.Deserialize<Response>(responseBody); 

      } 

我的問題是我如何讀取json文件上的用戶字段。如下所示;

"user" : { 
    "id" : 12345, 
    "screen_name" : "twitpicuser" 
} 

它有子屬性和值。我怎麼能在我的Response類上命名它們?我的答覆班現在看起來像這樣;

public class Response { 

    public string id { get; set; } 
    public string text { get; set; } 
    public string url { get; set; } 
    public string width { get; set; } 
    public string height { get; set; } 
    public string size { get; set; } 
    public string type { get; set; } 
    public string timestamp { get; set; } 

} 

什麼是最好的情況下做到這一點?

+0

謝謝你,你的問題其實是有我一直在尋找其中的答案。 – afreeland 2013-01-16 20:53:04

回答

32
  1. 您需要創建一個保存用戶值的類,就像響應類User一樣。
  2. 使用新類的類型爲用戶值User添加一個屬性到Response類'user'。

    public class Response { 
    
        public string id { get; set; } 
        public string text { get; set; } 
        public string url { get; set; } 
        public string width { get; set; } 
        public string height { get; set; } 
        public string size { get; set; } 
        public string type { get; set; } 
        public string timestamp { get; set; } 
        public User user { get; set; } 
    
    } 
    
    public class User { 
    
        public int id { get; set; } 
        public string screen_name { get; set; } 
    
    } 
    

一般來說,你應該確保JSON的屬性類型和您的CLR類相匹配。似乎您試圖反序列化的結構包含多個數值(最有可能是int)。我不確定JavaScriptSerializer是否能夠自動將數字序列化爲字符串字段,但是您應該嘗試儘可能使CLR類型儘可能接近實際數據。

+1

Doh!你擊敗了我:-) – 2011-03-31 15:28:24

+1

@ntziolis感謝您的回覆。所以在Reponse類中的id屬性也應該是int我猜? – tugberk 2011-03-31 15:33:15

+1

@ntziolis:如果我沒有弄錯,你需要添加一個無參數的公共構造函數 – skarmats 2011-03-31 15:36:55

3

創建一個帶有ID字段和SCREEN_NAME領域的子類的用戶,就像這樣:

public class User 
{ 
    public string id { get; set; } 
    public string screen_name { get; set; } 
} 

public class Response { 

    public string id { get; set; } 
    public string text { get; set; } 
    public string url { get; set; } 
    public string width { get; set; } 
    public string height { get; set; } 
    public string size { get; set; } 
    public string type { get; set; } 
    public string timestamp { get; set; } 
    public User user { get; set; } 
} 
17

假設你不想創建另一個類,你總是可以讓解串器給你的字典鍵 - 值對,就像這樣:

string s = //{ "user" : { "id" : 12345, "screen_name" : "twitpicuser"}}; 
var serializer = new JavaScriptSerializer(); 
var result = serializer.DeserializeObject(s); 

你會回來的東西,在這裏你可以這樣做:

var userId = int.Parse(result["user"]["id"]); // or (int)result["user"]["id"] depending on how the JSON is serialized. 
// etc. 

在調試器中查看result,看看裏面有什麼。

+0

將數組索引到結果中是一個很好的(事後明顯的)觸摸。謝謝! – jerhewet 2012-07-09 20:55:38

+14

我收到錯誤:無法將[]的索引應用於'object'類型的表達式 – cikatomo 2013-02-20 08:31:33

+5

更改var result = serializer.DeserializeObject(s);動態結果= serializer.DeserializeObject(s);在.net 4+中爲我工作 – 2015-07-08 01:12:44

1
public class User : List<UserData> 
    { 

     public int id { get; set; } 
     public string screen_name { get; set; } 

    } 


    string json = client.DownloadString(url); 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    var Data = serializer.Deserialize<List<UserData>>(json); 
4

對於.NET 4+:

string s = "{ \"user\" : { \"id\" : 12345, \"screen_name\" : \"twitpicuser\"}}"; 

var serializer = new JavaScriptSerializer(); 
dynamic usr = serializer.DeserializeObject(s); 
var UserId = usr["user"]["id"]; 

對於.NET 2/3.5: 此代碼應在JSON工作與第1級

samplejson.aspx

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Globalization" %> 
<%@ Import Namespace="System.Web.Script.Serialization" %> 
<%@ Import Namespace="System.Collections.Generic" %> 
<% 
string s = "{ \"id\" : 12345, \"screen_name\" : \"twitpicuser\"}"; 
var serializer = new JavaScriptSerializer(); 
Dictionary<string, object> result = (serializer.DeserializeObject(s) as Dictionary<string, object>); 
var UserId = result["id"]; 
%> 
<%=UserId %> 

對於2級JSON:

sample2。ASPX

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Globalization" %> 
<%@ Import Namespace="System.Web.Script.Serialization" %> 
<%@ Import Namespace="System.Collections.Generic" %> 
<% 
string s = "{ \"user\" : { \"id\" : 12345, \"screen_name\" : \"twitpicuser\"}}"; 
var serializer = new JavaScriptSerializer(); 
Dictionary<string, object> result = (serializer.DeserializeObject(s) as Dictionary<string, object>); 
Dictionary<string, object> usr = (result["user"] as Dictionary<string, object>); 
var UserId = usr["id"]; 
%> 
<%= UserId %> 
0
//Page load starts here 

var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new 
{ 
    api_key = "my key", 
    action = "categories", 
    store_id = "my store" 
}); 

var json2 = "{\"api_key\":\"my key\",\"action\":\"categories\",\"store_id\":\"my store\",\"user\" : {\"id\" : 12345,\"screen_name\" : \"twitpicuser\"}}"; 
var list = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<FooBar>(json); 
var list2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<FooBar>(json2); 

string a = list2.action; 
var b = list2.user; 
string c = b.screen_name; 

//Page load ends here 

public class FooBar 
{ 
    public string api_key { get; set; } 
    public string action { get; set; } 
    public string store_id { get; set; } 
    public User user { get; set; } 
} 

public class User 
{ 
    public int id { get; set; } 
    public string screen_name { get; set; } 
} 
相關問題