如何在ApiController上的json负载中有一种动态字段



我需要json模式的一部分是可变的。如何声明将绑定到json的动态部分的字段?

我使用的是netcore6.0和Newtonsoft串行器。

示例:

{ 
id:1,
...
dynamicData: //from here the json can be any valid json structure. the type is unknow.
}

有效载荷等级为:

public class SomePayload {
public int id {get;set;}
public dynamic dynamicData {get;set;}
}

使用dynamic类型,json部分被放在对象内部的对象中。

这意味着,如果我发送这个有效载荷:

{
"id":1,
"dynamicData": {"x":1}
}

dynamicData将得到{{"x":1}}

声明dynamicData为字符串并在控制器方法中解析它应该可以,但是应该有一个干净的方法来做这件事,但我并不知道。类型不必是dynamic类型。

为了完整起见,这里的控制器:

[ApiController]
[Route("[controller]")]
public class SomeController : ControllerBase
{
[HttpPost]
public void submit(SomePayload payload)
{
}            
}

和program.cs文件将NewtonsoftJson设置为api序列化程序(6之前的.net核心版本使用启动类(:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();

我通过用类型对象声明属性并将其反序列化为与动态数据格式匹配的模型来实现这一点。

动态模型

public class SomePayload {
public int id {get;set;}
public object dynamicData {get;set;}
}

反序列化动态数据的模型

public class modelThatMatchesDynamicData {

public int x {get;set;}
public string y {get;set;}
}

请求主体

{
"id": 20,
"dynamicData": {
"x": 47,
"y": "string"
}
}

反序列化

[ApiController]
[Route("[controller]")]
public class SomeController : ControllerBase
{
[HttpPost]
public void submit(SomePayload payload)
{
var variable = JsonConvert.DeserializeObject<modelThatMatchesDynamicData>(JsonConvert.SerializeObject(payload));
}            
}

它对你有用吗?

相关内容

最新更新