如何解析包含对象列表的 JSON

Posted

技术标签:

【中文标题】如何解析包含对象列表的 JSON【英文标题】:How to parse JSON which include list of objects 【发布时间】:2020-07-29 22:37:41 【问题描述】:

我需要将 JSON 解析为包含对象列表的对象。所以这是我的JSON。

我为它创建了两个类。有他们

public class Picture

    public int id  get; set; 
    public string pageURL  get; set; 
    public string type  get; set; 
    public string tags  get; set; 
    public string previewURL  get; set; 
    public int previewWidth  get; set; 
    public int previewHeight  get; set; 
    public string webformatURL  get; set; 
    public int webformatWidth  get; set; 
    public int webformatHeight  get; set; 
    public string largeImageURL  get; set; 
    public int imageWidth  get; set; 
    public int imageHeight  get; set; 
    public int imageSize  get; set; 
    public int views  get; set; 
    public int downloads  get; set; 
    public int favorites  get; set; 
    public int likes  get; set; 
    public int comments  get; set; 
    public int user_id  get; set; 
    public string user  get; set; 
    public string userImageURL  get; set; 

public class PicturesByTopic

    public int total  get; set; 
    public int totalHits  get; set; 
    public List<Picture> Pictures  get; set; 
    public PicturesByTopic()
    
        Pictures = new List<Picture>();
    

我尝试以两种方式解析它们:

static PicturesByTopic GetPicturesByTopic(Message message)

    var topic = message.Text;
    var url = $"https://pixabay.com/api/?key=PicturesAPIKEY&q=topic&image_type=photo&pretty=true";
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

    string response;
    using (StreamReader stream = new StreamReader(httpWebResponse.GetResponseStream()))
    
        response = stream.ReadToEnd();
    

    PicturesByTopic picturesByTopic = JsonConvert.DeserializeObject<PicturesByTopic>(response);
    return picturesByTopic;
   

第二个变种:

static List<PicturesByTopic> GetPicturesByTopic(Message message)

    var topic = message.Text;
    var url = $"https://pixabay.com/api/?key=PicturesAPIKEY&q=topic&image_type=photo&pretty=true";
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

    string response;
    using (StreamReader stream = new StreamReader(httpWebResponse.GetResponseStream()))
    
        response = stream.ReadToEnd();
    

   
    var wrappedText = @" ""Prop"": " + response + " ";

    var jsonData = JObject.Parse(response);

    List<PicturesByTopic> RetsProperties = new List<PicturesByTopic>();

    foreach (var prop in jsonData["Prop"])
    
        RetsProperties.Add(new PicturesByTopic
        
            total = JsonConvert.DeserializeObject<int>(prop.First.ToString()),
            totalHits = JsonConvert.DeserializeObject<int>(prop.First.ToString()),
            Pictures = JsonConvert.DeserializeObject<Picture[]>(prop.First.ToString())
        );
    ;

    return RetsProperties;

    

但我无法通过其中两个获取正确的解析对象。那么对此有什么想法吗?希望,我的解释 已经够清楚了。

【问题讨论】:

【参考方案1】:

我会使用第一个变体。您的解决方案不起作用,因为 json 的名称与您的类不同。你应该重命名:

public List<Picture> Pictures  get; set; 

public List<Picture> hits  get; set; 

我不确定 JsonConvert 是否适用于 Hits,但如果适用,由于命名约定,您应该使用它。

编辑:如果您想继续使用图片作为属性名称,您可以使用 JsonProperty 属性,如下所示:

[JsonProperty("hits")]
public List<Picture> Pictures  get; set; 

【讨论】:

以上是关于如何解析包含对象列表的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有外部库的情况下解析包含对象列表的对象列表

解析包含不同对象列表的 JSON 文件

Python使用json加载解析带有两个json对象列表的文件

如何解析包含多个相同类型的 JSON 对象(不是数组)的 JSON 对象

当对象包含其他对象数组时如何解析 JSON?

如何使用 Kotlin 序列化解析 JSON 对象列表中的第一个属性?