了解动态 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 开发路径中发生变化。
有没有办法检索 dynamic
或 ExpandoObject
值的属性?
免责声明:在处理 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,它会更轻一些
我有一个 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 开发路径中发生变化。
有没有办法检索 dynamic
或 ExpandoObject
值的属性?
免责声明:在处理 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,它会更轻一些