Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用web服务时,如何知道通过JSON返回的数据类型?_C#_Json_Serialization_Json.net - Fatal编程技术网

C# 使用web服务时,如何知道通过JSON返回的数据类型?

C# 使用web服务时,如何知道通过JSON返回的数据类型?,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我以前没有使用JSON或web服务的经验,但是我正在尝试使用一个返回气象信息的web服务 在我尝试使用的API上 这个API为我提供了用JSON序列化的数据。我阅读了一些JSON,据我所知,下载后访问序列化数据的最佳方法是将其反序列化为具有匹配属性和类型的对象。这部分我做对了吗?然而,我不明白在这种情况下,我应该如何准确地知道通过JSON返回的数据类型 在我之前提到的API中,我得到了来自JSON中API的响应示例: {"coord": {"lon":145.77,"lat":-16.92},

我以前没有使用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);
string json=await client.GetStringAsync(“weather?q=London,uk&appid=010101010101”);
Rootobject currentWeather=新的Rootobject();
currentWeather=JsonConvert.DeserializeObject(json);
MessageBox.Show(currentWeather.name);
我知道在这种情况下,我可以更改类中属性的类型以匹配API返回的内容,但是我觉得这不对,主要是因为这可能会导致麻烦和不可预测的行为。我这样做对吗?也许我在API文档中遗漏了一些东西,他们不应该提供返回数据的类型吗?

正确:将其反序列化为具有匹配属性和类型的对象

首先检查API类型的文档,如果这不够全面,我会考虑更改您的类型,以匹配您从JSON中推断出的内容。

值289.9是一个浮点数

1435650870的值可以存储为int

AU的值可以是字符串/枚举

编辑: 我查看了您链接到的API文档,没有看到任何地方明确说明返回的数据类型

编辑2: 更直接地回答您的问题,“我应该如何准确地知道通过JSON返回的数据类型?”(谢谢@CodeCaster),而不在文档中找到这些信息,我认为您无法做到


但我觉得,只要看看返回的历史数据,就可以得到99.999%的接近率

如果您对使用dynamic感到满意,您可以试试这个片段

string json = await client.GetStringAsync("weather?q=London,uk&appid=010101010101010101101");
dynamic currentWeather= JObject.Parse(json);
MessageBox.Show(currentWeather.name);

您将在

中找到更多详细信息,Visual studio对该服务一无所知。它无法理解“10”是int还是float,甚至是string。它应该在该服务的文档中描述,您必须根据文档更改生成的模型。“粘贴为Json类”不能创造奇迹。例如,如果json中有一个int值,VisualStudio无法判断它可能是doble或float。您应该手动更改它。我理解“粘贴为Json类”的限制,这可能就是我问这个问题的原因。因此,如果VisualStudio不能发挥神奇的作用,并且没有其他方法可以确切地知道API开发人员心目中的类型,那么我是否可以假设文档中存在问题?因为使用这个API会让我觉得我不了解JSON,不知道如何使用它,而且我遗漏了一些东西。如果你的问题是“我应该如何准确地知道通过JSON返回的数据类型?”的话,那么使用
dynamic
并不是答案,因为你仍然需要“点进”动态对象。如果您需要了解数据类型,这是正确的,但我知道arthur需要解析json并显示数据,因此使用
dynamic
他将能够在不了解数据类型的情况下完成这项工作。在某个时候,您将不得不对数据做一些有用的事情。使用
dynamic
并不是一个解决方案,在某个时候,你必须知道某个东西是不是字符串、日期时间、整数、浮点……我完全同意你的看法。我刚刚提出了
dynamic
作为替代解决方案,假设解析json响应不需要数据类型,特别是当API文档没有指定确切的类型时。