我以前没有JSON或使用web服务的经验,但是我正在尝试使用返回气象信息的web服务。
这是我试图使用的API的文档。
这个API给我JSON序列化的数据。我对JSON进行了一些阅读,据我所知,在下载后访问这些序列化数据的最佳方法是将其反序列化为具有匹配属性和类型的对象。这部分我理解对了吗?我不明白,然而,在这种情况下,我应该如何准确地知道通过JSON返回的数据的类型。
在我之前提到的API中,我得到了这个JSON格式的API响应示例:
{"coord":
{"lon":145.77,"lat":-16.92},
"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],
"base":"cmc stations",
"main":{"temp":293.25,"pressure":1019,"humidity":83,"temp_min":289.82,"temp_max":295.37},
"wind":{"speed":5.1,"deg":150},
"clouds":{"all":75},
"rain":{"3h":3},
"dt":1435658272,
"sys":{"type":1,"id":8166,"message":0.0166,"country":"AU","sunrise":1435610796,"sunset":1435650870},
"id":2172797,
"name":"Cairns",
"cod":200}
我所做的是,在Visual Studio中,我使用了"粘贴特殊">"粘贴为JSON类"选项,它为我创建了这些类:
public class Rootobject
{
public Coord coord { get; set; }
public Weather[] weather { get; set; }
public string _base { get; set; }
public Main main { get; set; }
public Wind wind { get; set; }
public Clouds clouds { get; set; }
public Rain rain { get; set; }
public int dt { get; set; }
public Sys sys { get; set; }
public int id { get; set; }
public string name { get; set; }
public int cod { get; set; }
}
public class Coord
{
public float lon { get; set; }
public float lat { get; set; }
}
public class Main
{
public float temp { get; set; }
public int pressure { get; set; }
public int humidity { get; set; }
public float temp_min { get; set; }
public float temp_max { get; set; }
}
public class Wind
{
public float speed { get; set; }
public int deg { get; set; }
}
public class Clouds
{
public int all { get; set; }
}
public class Rain
{
public int _3h { get; set; }
}
public class Sys
{
public int type { get; set; }
public int id { get; set; }
public float message { get; set; }
public string country { get; set; }
public int sunrise { get; set; }
public int sunset { get; set; }
}
public class Weather
{
public int id { get; set; }
public string main { get; set; }
public string description { get; set; }
public string icon { get; set; }
}
问题是,当我使用HttpClient请求数据时,当我尝试反序列化响应时,我得到了一些关于不匹配数据类型的错误,例如,浮点数据被分配给int类型的属性。
下面是我的代码片段:
string json = await client.GetStringAsync("weather?q=London,uk&appid=010101010101010101101");
Rootobject currentWeather = new Rootobject();
currentWeather = JsonConvert.DeserializeObject<Rootobject>(json);
MessageBox.Show(currentWeather.name);
我明白,在这种情况下,我可以改变我的类中的属性的类型,以匹配API返回的内容,但这对我来说感觉不对,主要是因为它似乎可能是麻烦和不可预测行为的来源。我这样做对吗?也许我在API文档中遗漏了一些东西,它们不应该提供返回数据的类型吗?
正确:将其反序列化为具有匹配属性和类型的对象。
首先检查API文档中的类型,如果这还不够全面,我会考虑更改您的类型以匹配您从JSON中推断的类型。
289.9是浮点数
1435650870可以存储为int类型
AU可以是string/enum。
编辑:我检查了您链接到的API文档,没有看到任何地方显式地声明返回的数据类型。
编辑2:更直接地回答您的问题,"我应该如何准确地知道通过JSON返回的数据类型?"(感谢@CodeCaster),如果没有在文档中找到这些信息,我认为你做不到。
但我觉得你可以通过查看返回的历史数据得到99.999%的接近。
如果您满意使用动态,您可以尝试下面的代码片段
string json = await client.GetStringAsync("weather?q=London,uk&appid=010101010101010101101");
dynamic currentWeather= JObject.Parse(json);
MessageBox.Show(currentWeather.name);
您可以在文档