2011-10-21 13 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を使用してストリームからSEARCHVALCATEGORYX、およびYを取得する方法はありますか?

答えて

1

DataContractJSonSerializerはそれを行う1つの方法ですが、 "PageCount"オブジェクトが存在するとその使用が不安定になります。誰かがサーバ側で迷っているかのように見えますが、ページ数を外部オブジェクトのプロパティにするのはずっと意味があり、検索結果配列には同種のオブジェクトセットが含まれています。

System.Jsonの名前空間は、非常に柔軟なので、この種のJSONに便利です。

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

今では、我々はそれのためにDTOタイプを作成する必要があるので、最初にこの外のオブジェクトのセットを取得するには、いくつかのLINQを使用するができます -

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

​​は、あなたが今、表示のためにいくつかのXAMLにバインドすることができList<SearchResult>です。

+0

がうまく機能しました。 linqの使用法の良いサンプルも。 – Bahamut