C# 动态类型 Object 属性 First 始终为 null

Posted

技术标签:

【中文标题】C# 动态类型 Object 属性 First 始终为 null【英文标题】:C# dynamic type Object property First is always null 【发布时间】:2019-11-27 06:33:07 【问题描述】:

我正在使用 Newtonsoft.Json 在 C# 中创建一个动态对象并尝试迭代其成员。

Json 布局等于:

["id": "Name", "spec": More Data, "id": "Name", "spec": More Data, ...]

当我尝试以下操作时:

dynamic jsonObj = JsonConvert.DeserializeObject(jsonString);

      foreach (dynamic entry in jsonObj)

            dynamic first = entry.First;
      

我首先收到一个包含 null 的对象,即使条目具有运行时生成的成员 First 和 Last,它们不是 null(当我在 Visual Studio 中以调试模式查看它们时)。

可以访问成员。使用时:

dynamic first = entry["id"];

我收到了正确的值,而不是 null。所以里面一定有数据。

是否无法循环访问运行时生成的成员,还是有其他错误?

PS:我知道,我必须调用entry.First.First 才能访问"id" 的值。但这也只返回null

我的动态对象的内容截图:

【问题讨论】:

Json 中没有可以映射到First 属性的内容。如果您希望动态对象是一个集合,那么 json 需要采用集合格式,并且 json 中的集合格式以 [ 开头并以 ] 结尾 @ChetanRanpariya 谢谢,我纠正了这个错误。我也检查了代码中的对象。它被写成Collection。我还添加了动态对象内容的图像。 【参考方案1】:
using Newtonsoft.Json;
using System;

namespace ConsoleApp2

    class Program
    
        static void Main(string[] args)
        
            string jsonString = @"
[
    [      item1:  'id':      'Name'      ,
            item2:  'spec':    'More Data' 
        ,
           item1:  'id':      'Name'      ,
            item2:  'spec':    'More Data' 
        
    ]
]";

            dynamic jsonObj = JsonConvert.DeserializeObject(jsonString);

            foreach (dynamic row in jsonObj)
            
                Console.WriteLine($"Row\nrow\n--------------------");
                foreach (var column in row)
                
                    Console.WriteLine($"Column\ncolumn\n--------------------");
                    foreach (var item in column)
                    
                        Console.WriteLine($"item\nitem\n--------------------");
                        foreach (var part in item)
                        
                            Console.WriteLine($"part\npart\n--------------------");
                            foreach (var subpart in part)
                            
                                Console.WriteLine($"subpart\nsubpart\n--------------------");
                                foreach (var subsubpart in subpart)
                                
                                    Console.WriteLine($"subsubpart\nsubsubpart\n--------------------");
                                
                            
                        
                    
                
            

            Console.ReadKey();
        
    

给予:

Row
[
  
    "item1": 
      "id": "Name"
    ,
    "item2": 
      "spec": "More Data"
    
  ,
  
    "item1": 
      "id": "Name"
    ,
    "item2": 
      "spec": "More Data"
    
  
]
--------------------
Column

  "item1": 
    "id": "Name"
  ,
  "item2": 
    "spec": "More Data"
  

--------------------
item
"item1": 
  "id": "Name"

--------------------
part

  "id": "Name"

--------------------
subpart
"id": "Name"
--------------------
subsubpart
Name
--------------------
item
"item2": 
  "spec": "More Data"

--------------------
part

  "spec": "More Data"

--------------------
subpart
"spec": "More Data"
--------------------
subsubpart
More Data
--------------------
Column

  "item1": 
    "id": "Name"
  ,
  "item2": 
    "spec": "More Data"
  

--------------------
item
"item1": 
  "id": "Name"

--------------------
part

  "id": "Name"

--------------------
subpart
"id": "Name"
--------------------
subsubpart
Name
--------------------
item
"item2": 
  "spec": "More Data"

--------------------
part

  "spec": "More Data"

--------------------
subpart
"spec": "More Data"
--------------------
subsubpart
More Data
--------------------

【讨论】:

以上是关于C# 动态类型 Object 属性 First 始终为 null的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MongoDB 将动态 JSON 属性发布到 C# ASP.Net Core Web API?

c#中出现了object未定义怎么解决

如何检查 C# 中的动态匿名类型上是不是存在属性?

在 C# 4 中使用动态类型访问 javascript 对象的属性

为动态 JSON 创建 C# 模型

C#“动态”无法访问在另一个程序集中声明的匿名类型的属性