C# 将动态Json转换为更具体的内容
如何将下面的JSON反序列化为C#数组或更易于管理的东西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":
{
"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,这可能是原因,但是即使我将其更改为“数据”,我仍然会得到空对象。