2016-06-09 81 views
0

我試圖反序列化JSON一些在C#中,但是當我運行我的程序,我收到此錯誤信息:反序列化JSON在C#中的錯誤

enter image description here

我已經通過我的代碼看起來,並且我找不到一個「<」,並且我去了json來自的網址: http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json, 並且沒有「<」字符。我使用json2csharp.com將其轉換爲C#類,並且所有內容都很好。有什麼想法嗎?這裏是我嘗試做這一切的我的代碼部分:

var http = new HttpClient(); 
var url = "http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json"; 
var response = await http.GetAsync(url); 
var result = await response.Content.ReadAsStringAsync(); 
var serializer = new DataContractJsonSerializer(typeof(RootObject2)); 
var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
var data = (RootObject2)serializer.ReadObject(ms); 
return data; 
+2

與其訪問您從中獲得的網址,您爲什麼不在調試器中查看實際收到的內容?也許在服務器上有一些東西給你不同的結果,當你從C#中獲取比在瀏覽器中訪問它時。理想情況下,提供[mcve]。 –

+0

我們可以看到只讀取json的部分轉換爲字符串和反序列化調用的行嗎? –

+0

我想說,從http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=xml取得xml的合理機會,而不是http:// forecast的json。 weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json,但Jon是(當然!)絕對正確 - 更好地調試你實際試圖連載的內容,而不是猜測 –

回答

1

由於您沒有設置API所期望的標題,因此您的調用失敗。嘗試讀取響應之前,請添加用戶代理並檢查是否成功。

 var http = new HttpClient(); 
     var url = "http://forecast.weather.gov/MapClick.php?lat=47.1211&lon=-88.5694&FcstType=json"; 
     //Supply the same header as chrome 
     http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36"); 
     var response = await http.GetAsync(url); 
     if (response.IsSuccessStatusCode) 
     { 
      var result = await response.Content.ReadAsStringAsync(); 
      var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
      var serializer = new DataContractJsonSerializer(typeof(RootObject2)); 
      var data = (RootObject2)serializer.ReadObject(ms); 
     } 
0

檢查這個問題的答案,它說的一些問題與聯繫,他並沒有收到來自API的全面響應

Unexpected character encountered while parsing value:

+0

可能的,但我認爲連接不太可能不好,因爲我從其他三個API(來自不同站點)接收數據的罰款。 – issharp

+0

我在調用之前添加了這兩行,它可以看到IsSuccessStatusCode true http.DefaultRequestHeaders.Accept.Clear(); http.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(「application/json」)); –