c# - 如何在 C# 中处理来自 API 的 json 响应
问题描述
我已经阅读并重新阅读了有关如何执行此操作的在线文章,但这可能很简单。我正在尝试学习如何处理来自 API 调用的 json 响应。我有一个从 Main() 调用的简单方法
public async void apiTestCall()
{
var httpCall = new HttpClient();
var uri = new Uri("https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=1000&page=2&api_key=DEMO_KEY");
var result = new DataModel();
var response = await httpCall.GetStringAsync(uri);
result = JsonSerializer.Deserialize<DataModel>(response);
我期望“结果”是填充数据的 DataModel 对象。现在,什么都没有。
这是数据模型类
using System.Collections.Generic;
namespace APITestProject
{
class DataModel
{
public class Camera
{
public int id { get; set; }
public string name { get; set; }
public int rover_id { get; set; }
public string full_name { get; set; }
}
public class Rover
{
public int id { get; set; }
public string name { get; set; }
public string landing_date { get; set; }
public string launch_date { get; set; }
public string status { get; set; }
}
public class Photo
{
public int id { get; set; }
public int sol { get; set; }
public Camera camera { get; set; }
public string img_src { get; set; }
public string earth_date { get; set; }
public Rover rover { get; set; }
}
public class Example
{
public IList<Photo> photos { get; set; }
}
}
}
任何建议将不胜感激。
编辑 #1:这是 json 中的前 3 个条目。我不想发布整个内容,但 URL 对任何人都有效,可以运行并查看响应。
{"photos":[{"id":424926,"sol":1000,"camera":{"id":22,"name":"MAST","rover_id":5,"full_name":"Mast Camera"},"img_src":"http://mars.jpl.nasa.gov/msl-raw-images/msss/01000/mcam/1000ML0044631200305217E01_DXXX.jpg","earth_date":"2015-05-30","rover":{"id":5,"name":"Curiosity","landing_date":"2012-08-06","launch_date":"2011-11-26","status":"active"}},{"id":424927,"sol":1000,"camera":{"id":22,"name":"MAST","rover_id":5,"full_name":"Mast Camera"},"img_src":"http://mars.jpl.nasa.gov/msl-raw-images/msss/01000/mcam/1000MR0044631190503679E04_DXXX.jpg","earth_date":"2015-05-30","rover":
编辑#2:到目前为止,我根据评论进行了一些更改,我使用粘贴 > 特殊 > JSON 作为类并删除了“包装器”类。现在我得到了填充的对象。仅供参考,这是生成的新类 VS:
namespace APITestProject
{
public class DataModel
{
public Photo[] photos { get; set; }
}
public class Photo
{
public int id { get; set; }
public int sol { get; set; }
public Camera camera { get; set; }
public string img_src { get; set; }
public string earth_date { get; set; }
public Rover rover { get; set; }
}
public class Camera
{
public int id { get; set; }
public string name { get; set; }
public int rover_id { get; set; }
public string full_name { get; set; }
}
public class Rover
{
public int id { get; set; }
public string name { get; set; }
public string landing_date { get; set; }
public string launch_date { get; set; }
public string status { get; set; }
}
}
解决方案
你能试试下面的修改吗
var result = JsonSerializer.Deserialize<DataModel.Example>(response);
因为它看起来像 DataModel.Example 实际上是您尝试根据来自以下调用的响应反序列化的类 -
https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=1000&page=2&api_key=DEMO_KEY
即它返回一个对象,其中包含您定义的照片对象数组。正如其他人提到的,无需将所有这些类封装在另一个类中。
推荐阅读
- jquery - Jquery Hover Out - 添加超时中断工具提示?
- android - Android 布局预览编辑器 - 布局不可见:java.lang.IllegalArgumentException:对象不是声明类的实例
- azure-devops - Azure 资源管理器服务连接未连接
- java - 如何更改 IntelliJ IDEA 中 for 循环声明中变量的颜色?
- javascript - 检查 sessionStorage 中的多个键的条件
- python - 将 Pandas 数据框总结为半小时
- java - 通过 Spring restTemplate 从嵌套的 JSON 对象中获取数组作为列表
- javascript - 如何调用对象当前状态对应的函数?
- code-organization - 痴迷于让代码“看起来很漂亮”有什么好处吗?
- angular - HammerJS Swipe 在移动设备或设备模式下的 Google Chrome 上不起作用