了解动态 POST 主体参数

Understanding dynamic POST body parameter

我有一个 dotnet core Web API,它接受包含 JSON 的正文消息。我试过以各种形式写这个,例如:

[HttpPost]
public async Task<IActionResult> Create([FromBody] dynamic content)

很难检索属性并且不按名称 return 属性。

[HttpPost]
public async Task<IActionResult> Create([FromBody] ExpandoObject content)

也很难从中检索属性,尽管可以使用 ["details"] 检索顶级属性(尽管没有更深的)。

[HttpPost]
public async Task<IActionResult> Create([FromBody] JObject content)

这样可以很容易地检索属性:

var firstName = content["contact"][0]["firstName"];
var accountName = content["generalDetails"]["accountName"];

正在发送的正文信息是这样的,格式不会改变。

{
    "details": {
        "phone": 0123456789,
        "email": "test@gmail.com",
        "county": "BF"
    },
    "admin": {
        "number": "gb12345"
    },
    "additional": {},
    "contact": [
        {
            "firstName": "Jeff",
            "lastName": "Bezos",
            "title": "Mr."
        },
        {
            "firstName": "Steve",
            "lastName": "Jobs",
            "title": "Mr."
        }
    ]
}

我想使正文参数动态化(以某种形式),因为发送的实际正文内容非常大,包含的属性比上面示例中的多得多。避免创建大型 mapping/DTO class 似乎是谨慎的做法,以防消息的设计在 future/further 开发路径中发生变化。

有没有办法检索 dynamicExpandoObject 值的属性?


免责声明:在处理 C# 和类型化语言时,创建类型总是比依赖动态类型更好的主意,它为您提供语言设计的安全性和性能。


Is difficult to retrieve the properties and does not return the properties by name.

这正是 dynamic 的工作方式,因为类型未知,IDE 提示和编译器本身无法分辨绑定到该类型的属性,因此它不会给您任何建议关于它的属性,但您仍然可以访问它们。

假设您有以下类型:

public class MyType
{
   public int MyInt { get; set; }
   public string MyString { get; set; }
}

然后你做

dynamic myObj = new MyType();

如果你键入 myObj. no 属性 将由你的 IDE 显示,但无论如何你可以这样做,例如 Console.WriteLine(myObj.MyString) 它会与 no 一起工作问题。这里的重点是你需要确切地知道变量名和它的类型,因为如果你尝试做

int myInt = myObj.MyInt + myObj.MyString;

编译器会毫无问题地接受,但在运行时会有问题,因为类型只会在程序执行期间被发现。

如果您决定采用 non-typed 的处理方式,我建议您使用 dynamic 而不是 ExpandoObject 和 JObject,它会更轻一些