2010-02-28 44 views
9

Mã của tôi ở bên dưới. Tôi không thể trích xuất danh sách 'tên' và 'truy vấn' từ JSON qua Lớp DataContracted (bên dưới) Tôi đã dành một thời gian dài cố gắng để làm việc này, và thực sự có thể làm với một số trợ giúp .. .Danh sách Twitter JSON trong C# .net

My Json chuỗi:

{"as_of":1266853488,"trends":{"2010-02-22 
15:44:48":[{"name":"#nowplaying","query":"#nowplaying"},{"name":"#musicmonday","query":"#musicmonday"},{"name":"#WeGoTogetherLike","query":"#WeGoTogetherLike"},{"name":"#imcurious","query":"#imcurious"},{"name":"#mm","query":"#mm"},{"name":"#HumanoidCityTour","query":"#HumanoidCityTour"},{"name":"#awesomeindianthings","query":"#awesomeindianthings"},{"name":"#officeformac","query":"#officeformac"},{"name":"Justin 
Bieber","query":"\"Justin Bieber\""},{"name":"National 
Margarita","query":"\"National Margarita\""}]}} 

mã của tôi:

WebClient wc = new WebClient(); 
wc.Credentials = new NetworkCredential(this.Auth.UserName, this.Auth.Password); 
string res = wc.DownloadString(new Uri(link)); 
//the download string gives me the above JSON string - no problems 
Trends trends = new Trends(); 
Trends obj = Deserialise<Trends>(res); 


private T Deserialise<T>(string json) 
{ 
    T obj = Activator.CreateInstance<T>(); 
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     DataContractJsonSerializer serialiser = new DataContractJsonSerializer(obj.GetType()); 
     obj = (T)serialiser.ReadObject(ms); 
     ms.Close(); 
     return obj; 
    } 
} 


[DataContract] 
public class Trends 
{ 
    [DataMember(Name = "as_of")] 
    public string AsOf { get; set; } 

    //The As_OF value is returned - But how do I get the 
    //multidimensional array of Names and Queries from the JSON here? 
} 
+1

Điểm nhỏ: nếu bạn thêm ràng buộc mới "trong đó T: new()" vào phương pháp Deserialize của bạn, bạn sẽ không cần bit Activator.CreateInstance đó và chỉ có thể sử dụng T() mới. –

Trả lời

1

Hãy xem xét ví dụ sau:

public struct TwitterResponse 
{ 
    public int32 as_of; 
    public Trend[] Trends; 
} 

public struct Trends 
{ 
    public String name; 
    public String query; 
} 

Trend[] obj = JavaScriptConvert.DeserializeObject<TwitterResponse>(res).Trends; 

Có thể cần finetuning, nhưng đó là ý tưởng chung về cách thực hiện.

+0

Tôi đã thử điều này nhưng vẫn không phải là câu trả lời, cảm ơn – James

2

bạn đã xem xét sử dụng JSON.net chưa?

+0

Xin chào, Điều này không trả lời được câu hỏi. Tôi đang tìm cách để làm điều này trong C#. Tôi không hỏi nơi để tải về một dll bên thứ ba. Cảm ơn vì tất cả. – James

+0

Đó là cách thực hiện điều này trong C#. Bạn có nghĩa là làm thế nào để làm điều này trong chỉ Net Framework. – user7116

+1

(-1) Bạn đã không (trong * bất kỳ cách nào) chỉ ra lý do tại sao điều này là tốt hơn, làm thế nào để sử dụng này, những gì OP nên làm gì nếu họ đi qua cùng một vấn đề một lần nữa. Ngoài ra, gợi ý rằng ai đó hoàn toàn bắt đầu lại trên một thứ gì đó mà không có bất kỳ kiến ​​thức nào về dự án này thường không hiệu quả. – DevinB

3

Tôi đã gặp phải vấn đề này khi phát triển Twitterizer. Vấn đề là tập dữ liệu không có trong thiết kế hướng đối tượng truyền thống.

Nếu bạn đã lập bản đồ mà như các đối tượng, bạn sẽ thấy:

 
object root 
    int as_of 
    object trends 
    array[object] <date value of as_of> 
     string query 
     string name 

Như bạn có thể thấy, các đối tượng xu hướng có một tài sản đó là thay đổi tên. Tên được dựa trên giá trị ngày tháng của as_of. Như vậy, nó không thể được tự động deserialized.

Giải pháp đầu tiên của tôi là sử dụng System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(). Phương thức đó trả về một hệ thống phân cấp của các cá thể từ điển lồng nhau được đánh máy yếu. Sau đó tôi tự mình bước qua kết quả.

internal static TwitterTrendTimeframe ConvertWeakTrend(object value) 
{ 
    Dictionary<string, object> valueDictionary = (Dictionary<string, object>)value; 
    DateTime date = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds((int)valueDictionary["as_of"]); 
    object[] trends = (object[])((Dictionary<string, object>)valueDictionary["trends"])[date.ToString("yyyy-MM-dd HH:mm:ss")]; 

    TwitterTrendTimeframe convertedResult = new TwitterTrendTimeframe() 
    { 
     EffectiveDate = date, 
     Trends = new Collection<TwitterTrend>() 
    }; 

    for (int i = 0; i < trends.Length; i++) 
    { 
     Dictionary<string, object> item = (Dictionary<string, object>)trends[i]; 

     TwitterTrend trend = new TwitterTrend() 
     { 
      Name = (string)item["name"] 
     }; 

     if (item.ContainsKey("url")) 
     { 
      trend.Address = (string)item["url"]; 
     } 

     if (item.ContainsKey("query")) 
     { 
      trend.SearchQuery = (string)item["query"]; 
     } 

     convertedResult.Trends.Add(trend); 
    } 

    return convertedResult; 
}

Thật xấu, nhưng nó hoạt động.

Tôi đã chấp nhận việc sử dụng Json.NET cho tốc độ và sự đơn giản của nó.

Các vấn đề liên quan