2011-11-02 167 views
1

我已經有這個使用Silverlight的System.JSON但規格的回答得到了改變,現在我需要做的是在.net 3.5反序列化JSON使用JSON.NET

這裏是我得到

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

,並使用System.JSON組裝的解決方案是

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

我想大部分代碼類似於/一模一樣的,但我不知道有關的containsKey在JSON.net對口。我認爲這是Contains()方法,但我不確定如何使用它,以便我可以獲得SEARCHVAL的X和Y.

UPDATE:

所以這裏是我的代碼來獲得JSON流和解析:

 ... 
     Uri uri = new Uri(url); 

     WebClient client = new WebClient(); 
     ParseJSON(client.OpenRead(uri)); 
    } 


    private void ParseJSON(Stream stream) 
    { 
     if (stream == null) 
      return; 

     StreamReader reader = new StreamReader(stream); 
     JObject searchResult = JObject.Parse(reader.ReadLine()); 

     string x= searchResult["SearchResults"][0]["SEARCHVAL"]["X"].ToString(); 
     string y= searchResult["SearchResults"][0]["SEARCHVAL"]["Y"].ToString(); 

     // use data 
     ... 

和我得到的string lat = searchresult...空例外。任何線索我在哪裏使用JSON.NET出錯?

回答

-2

下面是一個使用JSON.NET工作液(來自手機發布)如果沒有不必要的字符,則可以忽略.Replace()解析的字符串。我使用的是Json.NET 3.5,因此您可能不需要在最新版本中執行此操作。

0

解析字符串,而不是手動使用LINQ我會建議你使用內置的JsonSerializer類。

reference msdn blog建議使用,如果它。

另外,如果我們沒有強類型的類,那麼使用System.JSON會很好。但在你的情況下,你有一個類,因此使用內置函數更好,我個人也喜歡使用內置的任何東西。

獲取JSON:

 WebClient client = new WebClient(); 
     using (StreamReader reader = new StreamReader(client.OpenRead(uri))) 
     { 
      json = reader.ReadToEnd(); 
     } 

解析流爲JObject:

 JObject searchResult = JObject.Parse(json); 

     string lat = searchResult["SearchResults"][1]["X"].ToString().Replace("\"",""); 
     string lon = searchResult["SearchResults"][1]["Y"].ToString().Replace("\"",""); 

+0

您已鏈接到JavaScriptSerializer。事實上,如果它不限於Silverlight,那麼使用System.JSON會很好。 – Bahamut