【问题标题】:C# dynamic type Object property First is always nullC# 动态类型 Object 属性 First 始终为 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。我还添加了动态对象内容的图像。

标签: c# json dynamic json.net enumerable


【解决方案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\n{row}\n--------------------");
                foreach (var column in row)
                {
                    Console.WriteLine($"Column\n{column}\n--------------------");
                    foreach (var item in column)
                    {
                        Console.WriteLine($"item\n{item}\n--------------------");
                        foreach (var part in item)
                        {
                            Console.WriteLine($"part\n{part}\n--------------------");
                            foreach (var subpart in part)
                            {
                                Console.WriteLine($"subpart\n{subpart}\n--------------------");
                                foreach (var subsubpart in subpart)
                                {
                                    Console.WriteLine($"subsubpart\n{subsubpart}\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
--------------------

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2011-08-18
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多