我们是两名想在学校项目中使用开放天气地图的学生。要从应用程序创建关于天气的接收信息的模型,我们必须创建一个模型,就像开放天气地图使用的模型一样。这就是收到的json字符串的样子:
{" COORD" {" LON":103.85" LAT":1.29}"天气":[{&# 34; id":803," main":"云","描述":"破碎的云","图标":" 04n"}],"基础":"站""主" {"温度&# 34;:302.39"压力":1008,"湿度":83," temp_min":301.15" temp_max":303.15}, "能见度":10000"风" {"速度":3.6"度" 180}"云&# 34;:{"所有" 75}," DT":1495107000," SYS" {"类型":1,&# 34; ID":8146,"消息":0.0229,"国家":" SG""日出":1495061739,& #34;日落":1495105587}" ID":1880252,"名称":"新加坡""鳕鱼":200 }
这是我使用新加坡网址获得的:
http://api.openweathermap.org/data/2.5/weather?q=singapore&APPID= ******
我的问题是,是否有人知道所有信息的确切数据类型?我们是否必须创建一个模型来接收api信息? 然后我们必须反序列化字符串。
答案 0 :(得分:0)
看起来JSON响应格式在他们的文档here中。遍历每个单独的值并告诉您它是什么,这可以让您创建一个类或以其他方式将其映射到C#代码。还为您提供了某些字段的值(main.temp可以是Kelvin,Celcius或Fahrenheit)。
我认为你必须在C#中创建某种模型来表示解析的JSON数据(如果你想使用它)。我将从每个数字字段开始,找出代表它们的最佳类型。然后我会添加字符串字段,例如国家/地区代码。然后对于具有设定数量的值的字段(例如:main.temp),我将它们作为单独的枚举,因此该字段只能是有效值之一。
答案 1 :(得分:0)
首先回答你的最后一个问题,
我们是否必须创建一个模型来接收api信息?
不,但建议吗?是。
拥有强类型类,而不是使用诸如dynamic
之类的东西,允许您进行编译时检查,而不是等待潜在的拼写错误或无效的强制转换,以炸弹并导致运行时错误。< / p>
要创建类,如我的评论中所述,您可以使用json2csharp,它将根据您提供的实际JSON示例使用类型。
下面是您提供的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 int visibility { get; set; }
public Wind wind { get; set; }
public Clouds clouds { 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 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; }
}
有了这个,你可以使用JSON.NET之类的东西将Json反序列化为一个Object,我在下面的代码片段中使用它。
class Program
{
// Our JSON Sample
private static string JsonSample =
"{\"coord\":{\"lon\":103.85,\"lat\":1.29},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"base\":\"stations\",\"main\":{\"temp\":302.39,\"pressure\":1008,\"humidity\":83,\"temp_min\":301.15,\"temp_max\":303.15},\"visibility\":10000,\"wind\":{\"speed\":3.6,\"deg\":180},\"clouds\":{\"all\":75},\"dt\":1495107000,\"sys\":{\"type\":1,\"id\":8146,\"message\":0.0229,\"country\":\"SG\",\"sunrise\":1495061739,\"sunset\":1495105587},\"id\":1880252,\"name\":\"Singapore\",\"cod\":200}"
;
static void Main(string[] args)
{
// Deserialize into our RootObject
Rootobject rootObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(JsonSample);
Console.WriteLine(rootObject.name); // Prints Singapore
Console.ReadKey();
}
}