Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将动态Json转换为更具体的内容_C#_Asp.net Core_Json.net - Fatal编程技术网

C# 将动态Json转换为更具体的内容

C# 将动态Json转换为更具体的内容,c#,asp.net-core,json.net,C#,Asp.net Core,Json.net,如何将下面的JSON反序列化为C#数组或更易于管理的东西 { "data": [ { "PropertyName": [ { "Key1": "test", "Key2": "afafa" }, { "Key1": "test", "Key2": "afafa" } ], "PropertyName2":

如何将下面的JSON反序列化为C#数组或更易于管理的东西

{
  "data": [
    {
      "PropertyName": [
        {
          "Key1": "test",
          "Key2": "afafa"
        },
        {
          "Key1": "test",
          "Key2": "afafa"
        }
      ],
      "PropertyName2": [
        {
          "Key1": "test",
          "Key2": "afafa"
        },
        {
          "Key1": "test",
          "Key2": "afafa"
        }
      ]
    }
  ]
}
它以动态参数的形式出现,如下所示:

public IActionResult SAve([FromBody] dynamic mapping)
public class MappingDto
{
    public List<Dictionary<string, List<Item>>> Data { get; set; }
}

public class Item
{
    public string Key1 { get; set; }
    public string Key2 { get; set; }
}
我通常会使它成为一个具体的类,但“PropertyName”将更改为不同的名称,因此我需要一些灵活的名称。它的内容可以是具体的,因为它只是两个属性

我在想它可能像一本字典

Dictionary<string, ConcreteClass>()
我试着这样改变信仰

 var ddd = JsonConvert.DeserializeObject<List<MappingDto>>(mapping.data.ToString());
var ddd=JsonConvert.DeserializeObject(mapping.data.ToString());
这将使数组中的对象为空。如果我没有把它包装在一个集合中,那么我会得到一个不同的错误

 public class MappingDto
    {
        public List<Dictionary<string, List<Item>>> Items { get; set; }
    }

  public class Items
    {
        public string Key1{ get; set; }
        public string Key2{ get; set; }

    }
公共类映射到
{
公共列表项{get;set;}
}
公共类项目
{
公共字符串Key1{get;set;}
公共字符串Key2{get;set;}
}

对于此JSON,处理动态属性名称的具体类结构如下所示:

public IActionResult SAve([FromBody] dynamic mapping)
public class MappingDto
{
    public List<Dictionary<string, List<Item>>> Data { get; set; }
}

public class Item
{
    public string Key1 { get; set; }
    public string Key2 { get; set; }
}
然后,您可以像这样访问数据(例如):


Fiddle:

对于此JSON,处理动态属性名称的具体类结构如下所示:

public IActionResult SAve([FromBody] dynamic mapping)
public class MappingDto
{
    public List<Dictionary<string, List<Item>>> Data { get; set; }
}

public class Item
{
    public string Key1 { get; set; }
    public string Key2 { get; set; }
}
然后,您可以像这样访问数据(例如):


Fiddle:

您可以使用JObject。然后,例如,您可以使用索引器通过字符串名称访问属性,就像字典一样,但更具动态性。下面是一个例子:您可以使用JObject。然后,例如,您可以使用索引器通过字符串名称访问属性,就像字典一样,但更具动态性。这里有一个例子:嗯,这似乎不起作用。我认为这是因为动力?它有一个额外的层或支架。我将更新我的帖子来展示这一点。你在最初的问题中说你想用具体的东西来替换
动态的
,所以我假设你会相应地更新方法签名。如果您这样做,它应该按预期工作。我已更新我的答案以显示此步骤。您不需要在方法内部单独调用
JsonConvert.DeserializeObject
。此外,不要将
MappingDto
类中的
数据
属性的名称更改为
,否则它将与JSON不匹配,您将得到一个空列表。您发布的JSON在根目录下有一个与此属性匹配的
data
键。另外,仅供参考,如果您的JSON真的有一层这样的大括号,那么它是无效的。我怀疑您正在从调试器中复制JSON?VisualStudio调试器出于某种原因添加了这些额外的大括号。它们不应该出现在真实数据中。您可以使用JSON验证器自己检查它,比如Yea,我正在查看VS so Yea,这可能是原因,但是即使我将其更改为“数据”,我仍然得到空对象。嗯,这似乎不起作用。我认为这是因为动力?它有一个额外的层或支架。我将更新我的帖子来展示这一点。你在最初的问题中说你想用具体的东西来替换
动态的
,所以我假设你会相应地更新方法签名。如果您这样做,它应该按预期工作。我已更新我的答案以显示此步骤。您不需要在方法内部单独调用
JsonConvert.DeserializeObject
。此外,不要将
MappingDto
类中的
数据
属性的名称更改为
,否则它将与JSON不匹配,您将得到一个空列表。您发布的JSON在根目录下有一个与此属性匹配的
data
键。另外,仅供参考,如果您的JSON真的有一层这样的大括号,那么它是无效的。我怀疑您正在从调试器中复制JSON?VisualStudio调试器出于某种原因添加了这些额外的大括号。它们不应该出现在真实数据中。您可以使用JSON验证器自己检查它,比如Yea,我正在查看VS so Yea,这可能是原因,但是即使我将其更改为“数据”,我仍然会得到空对象。