2011-10-21 44 views
2

我試圖解析這個使用System.Json,但我有點困惑如何使用LINQ這一點。 JSON字符串返回是這樣的:Linq解析爲JSON

{"SearchResults":[{"PageCount":"1"}, 
{"SEARCHVAL":"Result","CATEGORY":"Category1","X":"1","Y":"2"}, 
{"SEARCHVAL":"AnotherResult","CATEGORY":"Category1","X":"2","Y":"2"}]} 

我的代碼開始爲:

WebClient client = new WebClient(); 
client.OpenReadCompleted += 
    new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
client.OpenReadAsync(uri); 

然後繼續到結果存儲在流中的事件處理程序。任何示例如何從流中使用LINQ獲取僅SEARCHVAL s,CATEGORY s,X s和Y

回答

1

DataContractJSonSerializer是一種方法,但「PageCount」對象的存在使其使用awkard。它看起來好像有人在服務器端欺騙了一樣,讓頁面計入外部對象的屬性並因此讓搜索結果數組包含一組同類對象會更有意義。

System.Json命名空間對於這類JSON非常方便,因爲它非常靈活。

JsonObject searchResults = (JsonObject)JsonValue.Load(e.Result); 

現在你可以使用一些LINQ到獲得一組對象了這一點,但第一,所以我們需要爲它創建一個DTO類型: -

public class SearchResult 
{ 
     public string SearchValue {get; set;} 
     public string Category {get; set;} 
     public string X {get; set;} 
     public string Y {get; set;} 
} 

所以,現在的結果查詢: -

var resultList = ((JsonArray)searchResults["SearchResults"]) 
    .OfType<JsonObject>() 
    .Where(o => o.ContainsKey("SEARCHVAL")) 
    .Select(o => new SearchResult() { 
     SearchValue = o["SEARCHVALUE"], 
     Category = o["CATEGORY"]. 
     X = o["X"], 
     Y = o["Y"] 
    }).ToList(); 

的​​是List<SearchResult>,你現在可以綁定到一些的XAML顯示。

+0

很好地工作。 linq用法的好例子。 – Bahamut