将Dynamic Json转换为更具体的东西

时间:2018-10-16 13:31:06

标签: c# asp.net-core json.net

如何将下面的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)

我通常将其设为一个具体的类,但是“ PropertyName”将更改为不同的名称,因此我需要一些灵活的东西。它的内容可以是具体的,因为它只是两个属性。

我认为它可能像字典。

Dictionary<string, ConcreteClass>()

我只是不知道如何将其转换成这种形式。

编辑。

我已经提出建议了,但是没有用

{{
  "data": [
    {
      "propertyName": [
        {
          "key1": 1,
          "key2": "1"
        },
        {
          "key1": 2,
          "key2": "2"
        }
      ]
    }
  ]
}}

我试图这样转换

 var ddd = JsonConvert.DeserializeObject<List<MappingDto>>(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; }

    }

1 个答案:

答案 0 :(得分:2)

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

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; }
}

请确保将方法签名更新为使用新类,而不是dynamic

public IActionResult SAve([FromBody] MappingDto mapping)

然后您可以像这样访问数据:

foreach (var dict in mapping.Data)
{
    foreach (var kvp in dict)
    {
        Debug.WriteLine(kvp.Key);
        foreach (var item in kvp.Value)
        {
            Debug.WriteLine(" Key1: " + item.Key1); 
            Debug.WriteLine(" Key2: " + item.Key2); 
        }
    }
}

提琴:https://dotnetfiddle.net/OGylPh