如何在 C# 中迭代​​ JSON 并将每个对象添加到 List?

Posted

技术标签:

【中文标题】如何在 C# 中迭代​​ JSON 并将每个对象添加到 List?【英文标题】:How to iterate JSON in C# and add every object to List? 【发布时间】:2020-11-17 23:05:51 【问题描述】:

我有一个这种格式的 JSON:


  "id1": 
    "id": "183",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-27"
  ,
  "id2": 
    "id": "182",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-23"
  ,
  "id3": 
    "id": "180",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-20"
  ,
  "id4": 
    "id": "179",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-19"
  

我需要遍历它并将每个项目添加到新的 ArrayList:

ArrayList NewList = new ArrayList();

我需要它,以便稍后循环遍历我的 ArrayList 并检索我想要的任何对象。 我尝试使用这个网站https://json2csharp.com/,但它返回这个:

public class Id1    
    public string id  get; set;  
    public string contentname  get; set;  
    public string content  get; set;  
    public string created  get; set;  


public class Id2    
    public string id  get; set;   
    public string contentname  get; set;  
    public string content  get; set;  
    public string created  get; set;  


public class Root    
    public Id1 id1  get; set;  
    public Id2 id2  get; set;  

这对我来说不是很有用,因为会有 100 多个不同的 id 并且每天都会添加更多。

有什么方法可以做我想做的事吗?它适用于我的 Xamarin 项目,在 android 中我使用了 Volley 库,它运行良好,但我在 C# 中一直在苦苦挣扎。

感谢您的帮助:)

编辑: 这是生成我的 json 的 php

<?php
class SeznamNovinekApi extends BaseApi

    public function ToProcess($parametry)
    
        $novinkyInfo = Database::SqlGetFetchAll("select id, pageid, contentname, content, created from mainpagesarticles where pageid = ? order by created desc", array('novinky'));

        $i = 0;
        foreach ($novinkyInfo as $info)
        
            $i++;
            $obj = ["id" => $info["id"], "pageid" => $info["pageid"], "contentname" => $info["contentname"], "content" => $info["content"], "created" => $info["created"]];
            $this->json['id' . $i] = $obj;
        
    

?>

【问题讨论】:

您可以控制 JSON 吗?因为您的 JSON 不是对象数组。 是的,我愿意,但它是用 PHP 编写的,所以我不太确定如何:/ 你认为我必须更改我的整个 json 以使其与 C#“兼容”吗? app.quicktype.io?share=QBtI4DtpYJoYv5y3ytsw 你最好修复你的 JSON。你能发布生成这个的 PHP 代码吗? 您正在构建一个关联数组,而实际上并不需要它。相反,只需构建一个简单的数据数组,然后返回该数组的 json 【参考方案1】:

理想情况下,您的 JSON 应该看起来更像这样:

[
  
    "id": "183",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-27"
  ,
  
    "id": "182",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-23"
  ,
  
    "id": "180",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-20"
  ,
  
    "id": "179",
    "contentname": "Title",
    "content": "Some text",
    "created": "2020-07-19"
  
]

只是 JSON 对象的普通数组。您不需要外部标识符,但您确实需要一个数组。您之前的 JSON 是具有许多子对象的单个对象。

有了这个,(和伪代码)任何 JSON 转换器基本上都会像这样工作:

MyType[] arrayOfObjects = JSON.Convert<MyType>(myJson);

【讨论】:

【参考方案2】:

我完全使用了你的 json。

创建模型:

public class Data

    public int Id  get; set; 
    public string ContentName  get; set; 
    public string Content  get; set; 
    public DateTime Created  get; set; 

打开命名空间:

using Newtonsoft.Json.Linq;

使用此代码:

var text = File.ReadAllText("test.json");
var json = JObject.Parse(text);
var list = new List<Data>();

foreach (var prop in json.Properties())

    var value = prop.Value;
    var data = new Data
    
        Id = value["id"].Value<int>(),
        ContentName = value["contentname"].ToString(),
        Content = value["content"].ToString(),
        Created = value["created"].Value<DateTime>()
    ;
    list.Add(data);

【讨论】:

【参考方案3】:

通过您问题下方的 cmets,看到您有能力修复您的 Json,我建议您首先将您的 JSON 修复为类似这样的内容(它具有一个实际的 id 元素数组)。


  "ids": [
    
      "id": "183",
      "contentname": "Title",
      "content": "Some text",
      "created": "2020-07-27"
    ,
    
      "id": "182",
      "contentname": "Title",
      "content": "Some text",
      "created": "2020-07-23"
    ,
    
      "id": "180",
      "contentname": "Title",
      "content": "Some text",
      "created": "2020-07-20"
    ,
    
      "id": "179",
      "contentname": "Title",
      "content": "Some text",
      "created": "2020-07-19"
    
  ]

按顺序完成后,Visual Studio 中有一个非常漂亮的工具可帮助您基于此 JSON 构建类定义。将 json 复制到剪贴板并复制到:编辑 -> 选择性粘贴 -> 将 JSON 粘贴为类。您可以在打开 *.cs 文件时执行此操作。

这将为您构建以下 JSON。

public class Ids

    public Id[] ids  get; set; 


public class Id

    public string id  get; set; 
    public string contentname  get; set; 
    public string content  get; set; 
    public string created  get; set; 

之后,过程就很简单了:

private static void Main(string[] args)

    var json = File.ReadAllText("test.json");
    var ids = JsonSerializer.Deserialize<Ids>(json);
    Console.WriteLine(ids);

【讨论】:

假设 OP 出于某种原因想要一个对象,该对象只不过是其他对象的数组。这对我来说是一种代码味道,在父类中没有其他有用的东西,尤其是名称为“Ids”的东西不像 Int64。 我相信 OP 必须有潜力根据他的用例范围找出更好的属性命名。这不是这个 anwser 的目标。【参考方案4】:

非常感谢每一位回复的人,现在 mjwills 的 Quicktype 代码可以正常工作,但我可能会改正我的 json 并正确执行 :) 谢谢!

【讨论】:

以上是关于如何在 C# 中迭代​​ JSON 并将每个对象添加到 List?的主要内容,如果未能解决你的问题,请参考以下文章

如何迭代角度 json 对象

如何在 C# 中使用嵌套的 json 对象

如何迭代嵌套的 JSON 对象 [重复]

C# Web API:迭代数组并追加到 HTML 表

在调用API后,将JSON对象反序列化为C#类[重复]。

我如何分离每个 JSON 对象并将它们分组到 JavaScript 中的数组?