【问题标题】:How to have a kind of dynamic field inside the json payload on a ApiController?如何在 ApiController 的 json 有效负载中拥有一种动态字段?
【发布时间】:2022-01-12 15:53:31
【问题描述】:

我需要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;}
}

使用dymanic 类型,json 部分被放入对象内部的对象中。 这意味着如果我发送这个有效载荷:

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

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

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

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

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

以及将NewtonsoftJson设置为api序列化器的program.cs文件(.net core 6之前的版本使用启动类):

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

【问题讨论】:

  • 是否要动态更改值数据类型?
  • 不,因为我不知道项目时的类型。我需要能够在任何有效的 struct json 对象中接收扩展数据

标签: web-services .net-core asp.net-web-api json.net asp.net-core-webapi


【解决方案1】:

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

动态模型

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

它适合你吗?

【讨论】:

  • 这不是很动态,因为它需要以前知道的模型类
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2019-08-04
  • 2019-05-31
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多