Web Services 如何在ApiController上的json有效负载内拥有一种动态字段?

zaqlnxep  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(154)

我需要json模式的一部分是可变的。我如何声明一个将绑定到json的动态部分的字段?
我使用的是net core 6.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序列化程序(.net core版本6之前的版本使用startup类):

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

xzlaal3s1#

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

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));
    }            
}

这对你有用吗?

相关问题