C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

Posted

技术标签:

【中文标题】C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]【英文标题】:C# JSON Deserialization: How to get values out of a JSON array of objects [duplicate] 【发布时间】:2021-05-30 12:49:40 【问题描述】:

我正在尝试从 .json 数组创建一个数组,并从整个当前 .json 数组中仅获取数组中的 2 个变量(keyName 和 token)。

api 调用正在接收的 .json:


  "project": [
   
      "id": 1,
      "keyName": "John123",
      "age": "19",
      "token": "123456789"
    ,
    
      "id": 2,
      "keyName": "Mary123",
      "age": "13",
      "token": "23435"
    ,
    
      "id": 3,
      "keyName": "Harry123",
      "age": "23",
      "token": "2343542"
    
  ] 

我只想要一个为每个对象显示 keyName 和令牌的数组,我该怎么做?

目前我使用 api 调用来获取 .json 文件,然后我将其解析为一个数组,如下所示:

 Projects = JArray.Parse(resp.Content);

由于我是 C# 的新手,请提供帮助,如果有些没有意义,请原谅我的英语不是很好。

【问题讨论】:

您显示的不是有效的 JSON。请展示您实际收到的内容,不要弄乱它。 【参考方案1】:

  "project": [
   
      "id": 1,
      "keyName": "John123",
      "age": "19",
      "token": "123456789"
    ,
    
      "id": 2,
      "keyName": "Mary123",
      "age": "13",
      "token": "23435"
    ,
    
      "id": 3,
      "keyName": "Harry123",
      "age": "23",
      "token": "2343542"
    
  ] 

您可以使用 Newtonsoft.Json 框架进行 json 操作,您可以从 NuGet Package Manager 安装该框架。然后使用您需要的数据创建一个 Project 模型。您可以使用 JSONData 类进一步抽象它,因此如果您的 json 数据增长,您可以向其添加新属性。之后只需反序列化它。

public class Project

    public string KeyName  get; set; 
    public string Token  get; set; 


public class JSONData

    public List<Project> Projects  get; set; 


public class Deserializer

    //---------------- FIELDS -----------------
    private readonly string path = @"../../yourJsonFile.json";
    private readonly JSONData jsonData;
    
    //------------- CONSTRUCTORS --------------
    public Deserializer() 
        this.jsonData = JsonConvert.DeserializeObject<JSONData>(File.ReadAllText(this.path));
    

这样你就不会像这样复制反序列化代码

JsonConvert.DeserializeObject<List<Project>>(path);
JsonConvert.DeserializeObject<List<Category>>(path);
JsonConvert.DeserializeObject<List<Product>>(path);

【讨论】:

【参考方案2】:

您可以在 JsonSerializer 的帮助下反序列化 JSON 文件。

您需要做的第一件事是创建将描述 json 数据的 C# 类。它可以是常规的 POCO 课程。在您的情况下,它看起来类似于:

public class Foo

    public string KeyName get; set;
    public string Token get; set;

那么你需要做的就是通过HttpClient从API获取数据并调用JsonSerializer的.Deserialize方法。

【讨论】:

【参考方案3】:

我建议从 json 文档的格式开始,以便能够反序列化对象。

有效的json格式:


  "project": [
   
      "id": 1,
      "keyName": "John123",
      "age": "19",
      "token": "123456789"
    ,
    
      "id": 2,
      "keyName": "Mary123",
      "age": "13",
      "token": "23435"
    ,
    
      "id": 3,
      "keyName": "Harry123",
      "age": "23",
      "token": "2343542"
    
  ] 

然后你应该创建一个 Key 对象:

public class Project
       
    public int id  get; set; 
    public string keyname  get; set; 
    public string age get;set;
    public string token get;set;

您现在可以将 json 序列化为 key 对象的数组,并通过 Linq 查询它

    List<Project> projects = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Project>>("content of the json file");
    var keyAndToken = projects.Select(c=> c.keyname, c.token);

【讨论】:

以上是关于C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#如何生成JSON字符串?(序列化对象)

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

如何将 JSON 返回反序列化为从 RestSharp 调用到 API 的对象数组?

C# - 反序列化具有多个对象的 Json 对象

C# JSON 对象不会反序列化

在 C# 中将 JSON 数组反序列化为对象