如何在ASP.NET MVC控制器中反序列化JSON数组数据

时间:2018-10-31 20:21:14

标签: c# json asp.net-mvc

我已经成功反序列化了一个简单的json对象,但是当我使用POST请求向控制器发送json对象数组时,它失败了。这是我的代码:

[HttpPost]
public string addWwarehouse([FromBody] warehouse warehouses)
{
      System.Diagnostics.Debug.WriteLine(warehouses[0].name);
      return "success";
}

这是有效的json数据:

{
    "warehouses":
    {
        "name":"WarehouseA",
        "location":"locationA"
    }
}

但是当我使用这样的数组时,

[{
    "warehouses":
    {
        "name":"WarehouseA",
        "location":"locationA"
    }
}]

它不起作用。我也尝试使用List<warehouse>,但还是没有运气。这是我的warehouse课:

public class warehouse { 
    public string name  { get; set; }
    public string location { get; set; }
}

2 个答案:

答案 0 :(得分:2)

欢迎使用StackOverflow。

不是因为您的模型不是List<warehouse>

[{
    "warehouses":
    {
        "name":"WarehouseA",
        "location":"locationA"
    }
}]

它是对象每个的数组,它们的属性为“仓库”,其中包含类型为warehouse的单个对象。您可能想发送一系列仓库:

[{
    "name":"WarehouseA",
    "location":"locationA"
}, {
    "name":"WarehouseB",
    "location":"locationB"
}]

并将其反序列化为List<warehouse>

P.S。 如果您无法控制json格式,那么@TiagoÁvila的答案应该可以解决问题。

让我们检查一下模型:

[{                                // [...] - array of some outer objs
    "warehouses":                 // with single property
    {                
        "name":"WarehouseA",      // inner obj that resides inside outer obj
        "location":"locationA"
    }
}]

答案 1 :(得分:1)

由于您的json的使用方式,您需要一个这样的类:

public class Warehouses
{
    public string name { get; set; }
    public string location { get; set; }
}

public class RootObject
{
    public Warehouses warehouses { get; set; }
}

然后,在您的操作中应该这样:

public string addWwarehouse([FromBody] RootObject warehouses)

我认为这会解决。