我得到一个无效的强制转换异常,指定的强制转换是无效的。在这一行:
RootObject mountain = JsonConvert.DeserializeObject<RootObject>(json1);
从文档来看,这应该没问题?我可以看到控制台输出是否正常?
反应:[{"Height_ft":2999.0,"Height_m":914.0,"ID":"c1","Latitude":57.588007,"Longitude":-5.5233564,"Name":"Beinn Dearg","snowCover"湿度":0.81:4.99,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;
}
}
返回的json数据是一个对象数组,而不是单个对象,由左括号和右括号[]
表示。您需要反序列化为数组或列表:
var mountains = JsonConvert.DeserializeObject<List<RootObject>>(json);
要访问反序列化负载中的第一个mountain,请使用.FirstOrDefault()
。
var mountain = mountains.FirstOrDefault();
if (mountain != null)
{
string toast = mountain.Name;
Toast.MakeText(this, toast, ToastLength.Long).Show();
}
看起来JSON是一个对象数组。您应该能够反序列化数组并获得第一个,如下所示:
RootObject mountain = JsonConvert.DeserializeObject<RootObject[]>(json1)[0];
需要注意的一点是,你在这里混合了一些技术。JsonValue
来自System.Json
命名空间,而JsonConvert
来自Newtonsoft.Json
(即JSON.Net)命名空间。如果你想严格使用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;
}
}