【问题标题】:JSON with Array Respone from API带有来自 API 的数组响应的 JSON
【发布时间】:2021-01-08 14:20:22
【问题描述】:

我有一个 HTTPclient,我正在向服务器发送请求。 来自服务器的响应是 JSON。在这个 Json 中也是一个数组。 我想在控制台中显示来自 JSON 的信息。 我从 JSON 中获取所有信息,但没有在控制台中显示数组。

JSON 看起来像这样:

{
    "Name1": "Karl",
    "Name2": "Peter",
    "Name3": "Wilhelm",
    "PreNames": {
        "PreName": "Werner",
        "PreName2": "Josef"
    }
}

所以现在我的代码到目前为止:

public class PreNames //for Array
    {
        public string PreName { get; set; }
        public string PreName2{ get; set; }
    }

    public class Names//for JSON
    {
        public string Name1{ get; set; }
        public string Name2{ get; set; }
        public string Name3{ get; set; }
    }

还有我的主要:

if (Response().IsSuccessStatusCode)
        {
            var namesJ= Response().Content.ReadAsAsync<IEnumerable<Names>>().Result;
            var preNamesJ= await Response().Content.ReadAsAsync<List<PreNames>>();



            foreach (var a in namesJ)

            {

                Console.WriteLine("Name1: {0}", a.Name1);

                foreach(var b in preNamesJ)
                {
                    Console.WriteLine("{0}", b.PreName);
                }
                
            }

所以在控制台中显示的是所有名称,但不是 PreNames,所以我无法从 JSON 中的数组中获取 PreNames...

我希望有人可以帮助我:)

【问题讨论】:

  • 添加正确的 JSON 这似乎无效
  • 我是怎么做到的? ://
  • 我是你的主异步?如果没有,您可能需要删除 await 关键字并在行尾添加一个 .Result() 。如果是,则应删除 .Result(),并在 "=" 右侧添加 await 关键字
  • JSON 的 Method 是正常的,但是数组的 Method 是 Async。也没有工作
  • 关于异步的评论,.Result() 看起来是正确的 json,如果这正是你返回的内容是无效的,它应该是这样的: { "Name1": "Karl", "Name2": "Peter", "Name3": "Wilhelm", "PreNames": [ { "PreName": "Werner" }, { "PreName2": "Josef" } ] } 你不能没有一个 json 对象数组将键/值对放入 {...}

标签: c# arrays json rest httpclient


【解决方案1】:

将 PreNames 属性添加到您的 Names 类,并且只读取一次。

public class Names//for JSON
    {
        public string Name1{ get; set; }
        public string Name2{ get; set; }
        public string Name3{ get; set; }
        public List<PreNames> PreNames { get; set;}
    }

一旦你读入一次结果,你就可以通过主对象访问元素

var namesJ= Response().Content.ReadAsAsync<Names>().Result;
foreach(var names in namesJ.PreNames)
{
  Console.WriteLine(names.PreName);
}

更新 由于您更改了 json 并使 PreNames 只是一个对象而不是数组,因此只需访问相关对象的属性。

public class Names//for JSON
    {
        public string Name1{ get; set; }
        public string Name2{ get; set; }
        public string Name3{ get; set; }
        public PreNames PreNames { get; set;}
    }

var namesJ= Response().Content.ReadAsAsync<Names>().Result;
Console.WriteLine(namesJ.PreNames.Name);

【讨论】:

    【解决方案2】:

    @Leonc443,这是一个工作代码

        using Newtonsoft.Json;  //add this nuget package
        using System;
    
        namespace ConsoleApp
        {
            class Program
            {
                public static void Main(string[] args)
                {
                    string json = @"{
                        'Name1': 'Karl',
                        'Name2': 'Peter',
                        'Name3': 'Wilhelm',
                        'PreNames': {
                                    'PreName': 'Werner',
                                    'PreName2': 'Josef'
                                }
                    }";  // data received from api
                    var names = JsonConvert.DeserializeObject<Names>(json);
                    Console.WriteLine(names.Name1);     // Karl
                    Console.WriteLine(names.Name2);     //Peter
                    Console.WriteLine(names.Name3);     //Wilhelm
                    Console.WriteLine(names.PreNames.PreName);      //Werner
                    Console.WriteLine(names.PreNames.PreName2);     // Josef
    
                }
            }
            public class Names
            {
                public string Name1 { get; set; }
                public string Name2 { get; set; }
                public string Name3 { get; set; }
                public PreNames PreNames { get; set; }
            }
    
            public class PreNames
            {
                public string PreName { get; set; }
                public string PreName2 { get; set; }
            }
        }
    

    如果有帮助请告诉我

    【讨论】:

      【解决方案3】:

      如果你的 Json 看起来像:

      {
          "Name1": "Karl",
          "Name2": "Peter",
          "Name3": "Wilhelm",
          "PreNames": {
              "PreName": "Werner",
              "PreName2": "Josef"
          }
      }
      

      如果 PreNames 在 Names 中,您应该将 PreNames 字段添加到 Names 类。

      public class Names
      {
          public string Name1 { get; set; }
          public string Name2 { get; set; }
          public string Name3 { get; set; }
          public PreNames PreNames { get; set; }
      }
      

      然后你可以读取内部的 PreNames:

      foreach (var b in a.Prenames) {
          Console.WriteLine(b.PreName);
      }
      

      但我不确定我是否理解你的问题。

      【讨论】:

        【解决方案4】:

        我没有足够的声誉来发表评论,所以...我会尝试一下。

        在答案中更新正确的 json 后编辑。

        1. 更改您的班级名称
        public class Names
        {
            public string Name1 { get; set; }
            public string Name2 { get; set; }
            public string Name3 { get; set; }
            public PreNames PreNames { get; set; }
        }
        
        1. 然后用 JsonConvert 反序列化它
        var json = await Response().Content.ReadAsStringAsync();
        var names = JsonConvert.DeserializeObject<Names>(json);
        
        1. 然后访问数据
        Console.WriteLine($"Name 1: {names.Name1}");
        Console.WriteLine($"Prename 1: {names.PreNames.PreName}");
        

        【讨论】:

        • “name.PreNames?.PreName”不起作用...在 PreName? 之后,我无法选择 PreName
        • 如果您在调试模式下将鼠标悬停在名称(名称中的变量名称)上,您应该会看到 Name1、Name2、Name3 和 PreNames。我添加了?以防万一值(PreNames)为空,这似乎是这种情况。您能否澄清一下您收到的原始 json 的那部分到底是什么?
        • 当我将鼠标悬停时,我可以看到在“json”中是整个响应,但“name”为空。和?也添加了
        • 刚刚看到你编辑了第一个 json,所以在这里(我也会更新我的答案):dotnetfiddle.net/9EG8WK
        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 2019-02-09
        • 2020-01-11
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        相关资源
        最近更新 更多