首页 > 解决方案 > 如何在 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; }
    }
}

标签: c#json

解决方案


你能试试下面的修改吗

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

即它返回一个对象,其中包含您定义的照片对象数组。正如其他人提到的,无需将所有这些类封装在另一个类中。


推荐阅读