2016-08-10 6 views
1

指定されたキャストが無効である無効なキャスト例外が発生します。この行には:Invalidcastexception JsonConvert.DeserializeObject

RootObject mountain = JsonConvert.DeserializeObject<RootObject>(json1); 

documentationから、これは問題ありませんか?私はコンソールの出力がうまくいくのが分かりますか?

応答:[{ "Height_ft":2999.0、 "Height_m":914.0、 "ID": "C1"、 "緯度":57.588007、 "経度":-5.5233564、 "名前"、「Beinn Dearg」、 "湿度":0.81は、 "積雪":4.99、 "温度":あなたのJSONオブジェクトの配列であるように63.0}]

 Spinner spinner = (Spinner)sender; 
     string urlmountain = "http://removed.azurewebsites.net/api/Mountains?name="; 
     JsonValue json1 = FetchMountain(urlmountain+string.Format("{0}", spinner.GetItemAtPosition(e.Position))); 
     //below................................. 
     RootObject mountain = JsonConvert.DeserializeObject<RootObject>(json1); //this line 
     string toast = mountain.Name; 
     Toast.MakeText(this, toast, ToastLength.Long).Show(); 

    private JsonValue FetchMountain(string urlmountain) 
    { 
     // Create an HTTP web request using the URL: 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(urlmountain)); 
     request.ContentType = "application/json"; 
     request.Method = "GET"; 

     // Send the request to the server and wait for the response: 
     using (WebResponse response = request.GetResponse()) 
     { 
      // Get a stream representation of the HTTP web response: 
      using (Stream stream = response.GetResponseStream()) 
      { 
       // Use this stream to build a JSON document object: 
       JsonValue jsonDoc1 = JsonObject.Load(stream); 
       Console.Out.WriteLine("Response: {0}", jsonDoc1.ToString()); 

       // Return the JSON document: 
       return jsonDoc1; 
      } 
     } 
    } 
    public class RootObject 
    { 
     public string ID { get; set; } 

     public double? Latitude { get; set; } 

     public double? Longitude { get; set; } 

     public string Name { get; set; } 

     public double? Height_m { get; set; } 

     public double? Height_ft { get; set; } 

     public double? temperature { get; set; } 

     public double? humidity { get; set; } 

     public double? snowCover { get; set; } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 
+0

質問に「RootObject」クラス定義を追加することはできますか?サンプルのAPI呼び出しも役立ちます。 –

+0

一瞬。 –

答えて

2

をJSONデータが返される開閉括弧で示すようにオブジェクトの配列ではなく、単一のオブジェクトであり、[].FirstOrDefault()を使用し、非直列化されたペイロードから最初の山にアクセスするには

var mountains = JsonConvert.DeserializeObject<List<RootObject>>(json); 

:あなたは、配列またはリストにデシリアライズする必要があります。

var mountain = mountains.FirstOrDefault(); 
if (mountain != null) 
{ 
    string toast = mountain.Name; 
    Toast.MakeText(this, toast, ToastLength.Long).Show(); 
} 
+0

私はこれをしましたが、私はこの方法で山にアクセスできませんか?私はURLから一つの山しか返していないのですか? –

+0

'.FirstOrDefault()'でレコードのペイロードを安全にチェックすることができます。私の更新を見てください。 –

+0

'var mountains'で' Json.ToString() 'を忘れました。 +1してありがとう! –

2

は、それは見えます。あなたは、配列をデシリアライズし、そのような最初のものを得ることができる必要があります。注意すべき

RootObject mountain = JsonConvert.DeserializeObject<RootObject[]>(json1)[0]; 

ことの一つは、あなたが一種のここでの技術を混合していることです。 はNewtonsoft.Json(つまりJSON.Net)名前空間に由来します。JsonValueSystem.Json名前空間からのものです。あなたはJSON.Netと厳密に行きたいと思った場合、あなたはこのような何か行うことができます:

private RootObject FetchMountain(string urlmountain) 
{ 
    // Create an HTTP web request using the URL: 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(urlmountain)); 
    request.ContentType = "application/json"; 
    request.Method = "GET"; 

    using (WebResponse response = request.GetResponse()) 
    using (Stream stream = response.GetResponseStream()) 
    using (StreamReader streamReader = new StreamReader(stream)) 
    { 
     JsonSerializer serializer = new JsonSerializer(); 
     RootObject[] mountains = (RootObject[])serializer.Deserialize(streamReader, typeof(RootObject[])); 
     return (mountains.Length > 0) ? mountains[0] : null; 
    } 
} 
関連する問題