0

我正在尝试使用 JSON 对象作为主体进行 POST 请求。JSON 对象包含嵌套类型,这些嵌套类型是我正在使用的库中的预定义模型,但是当我使用 [FromBody] 属性时,只有根模型被绑定,而嵌套模型为空。

我试过不使用 [FromBody] 属性,但它也只绑定根级模型。

POST 对象示例:Foo 将是一个采用 Bar 对象的模型。Bar 将是一个具有属性 name 和 firstLetter 的模型。

{
  "foo": [
    {
      "bar": {
        "name": "bar",
        "firstLetter": "b"
      }
    },
    {
      "bar": {
        "name": "bar1",
        "firstLetter": "b"
      }
    }
  ]
}

控制器路由如下所示:

[HttpPost("example-route")]
public async Task<ActionResult<string>> Static([FromBody]Request request){
 //Some Action
}

Request 类看起来像:

//Request class
public class Request{
  [JsonConstructor]
  public Request(Bar b){
    this.Bar = b;
  }  

  public List<Bar> Bar = { get; set; }
}

//Bar class
public class Bar {

  public Bar(string name, string firstLetter){
     this.Name = name;
     this.FirstLetter = firstLetter;
  }

  public string Name { get; set; }
  public string FirstLetter { get; set; }

}

当我调用它时,Bar 将被分配,但它的 Name 和 FirstLetter 属性仍将为空。

编辑:我将在示例中添加列表,但我可能过于简化了。实际请求看起来更像:

{
    "prop1": "field1",
    "prop2": "4",
    "prop3": {
        "userId": "2",
        "customerId": "4",
        "type": {
            "userType": "Manager",
            "contactInfo": [
                {
                    "system": "email",
                    "value": "test@test.com"
                },
                {
                    "system": "phone",
                    "value": "555-555-5555"
                }
            ]
        }
    }
}

其中 prop1、prop2、prop3、type 和 contactInfo 都是我正在使用的库中定义的模型。我正在尝试获取 ContactInfo 对象,到目前为止,当我逐步执行时,它可以将两个对象分配给 ContactInfo,但它们的属性(系统和值)都是空的。我检查了拼写和大小写,但没有问题。

4

1 回答 1

3

您的Request类必须与 JSON 中的内容完全匹配,并注意嵌套:

public class Request
{
  public List<BarContainer> foo {get; set;}
  // Your constructor should initialize this list.
}

public class BarContainer
{
  public Bar bar {get; set;}
}

public class Bar
{
  [JsonProperty("name")]
  public string Name { get; set;}
  [JsonProperty("firstLetter")]
  public string FirstLetter { get; set;}
}

注意:反序列化是区分大小写的,因此您需要使用 JSON 中的确切名称,bar, foo, namefirstLetter或使用属性或配置来支持属性名称的不同大小写:

于 2019-05-09T14:44:11.830 回答