【发布时间】:2021-10-15 12:49:35
【问题描述】:
来自 api 调用:
var httpClient = new HttpClient();
var uri = "https://api.postcodes.io/postcodes/";
var response = await httpClient.PostAsync(uri, data);
string result = response.Content.ReadAsStringAsync().Result;
var list = JsonConvert.DeserializeObject<GeoDataList>(result);
有两个自定义类:
[Serializable]
public class GeoData
{
[JsonProperty("postcode")]
public string postcode { get; set; }
[JsonProperty("longitude")]
public string longitude { get; set; }
[JsonProperty("latitude")]
public string latitude { get; set; }
}
public class GeoDataList
{
[JsonProperty("result")]
public List<GeoData> geoDatas { get; set; }
}
结果包含这个 json 字符串:
{
"status": 200,
"result": [{
"query": "OX49 5NU",
"result": {
"postcode": "OX49 5NU",
"longitude": -1.069876,
"latitude": 51.6562
}
}, {
"query": "M32 0JG",
"result": {
"postcode": "M32 0JG",
"longitude": -2.302836,
"latitude": 53.455654
}
}, {
"query": "NE30 1DP",
"result": {
"postcode": "NE30 1DP",
"longitude": -1.439269,
"latitude": 55.011303,
}
}]
}
列表包含 3 个空对象。邮政编码、经度和纬度为空。 如何填充内部对象 (GeoData)?
亲切的问候 /鲁迪
【问题讨论】:
-
您是否期望所有这 3 个内部
"result"s 最终作为它的直接后代出现在您的一个外部 C# 对象中?您的 C# 类结构未映射到 json 结构.. -
列表中有2个
result属性,在列表的项中,你的模型类显然是错误的 -
@Rudy W check this 示例输出,您的
GeoData类定义错误,与json不匹配。 -
除了我在下面提到的内容之外,还想让您知道(以防您不知道)现在许多 JSON 发射 API 都有可用的 swagger/openapi 定义;这是一堆 JSON,描述了服务所做的一切、它消耗和发出的所有对象、所有端点的名称等等。为什么这对你来说很有趣?好吧,你可以使用一些工具,比如 NSwagStudio、AutoRest 等,然后对工具说“这里是 swagger/openapi 定义文件”,然后它会字面上为你写 everything ;你会得到一个你使用的客户端类..
-
var c = new PostcodesClient("https://api.postcodes.io"); var result = c.GetLatLong(some_query_data_here);就是这样,你想要的结果。 NSwag 等人编写了所有的 http 客户端代码,de/ser 代码一切——它使使用 API 就像添加 DLL 引用、创建新对象并调用它的方法一样简单。当你有一个你想要使用的 API 时,尝试找出它的 openapi 端点。在这种情况下,请参阅github.com/ideal-postcodes/openapi