gpt4 book ai didi

c# - "Unwrapping"发布 JSON

转载 作者:行者123 更新时间:2023-11-30 15:57:05 27 4
gpt4 key购买 nike

我正在寻找一种方法来“解开”已发布到 MVC 核心服务的 JSON。比方说,我有以下方法:

[HttpPost]        
public dynamic SayHello(string FirstName, string SecondName)
{
return $"Hello {FirstName} {SecondName} !";
}

然后我在以下 JSON 中发布:

{
"FirstName":"Joe",
"SecondName": "Bloggs"
}

我希望得到 Hello Joe Bloggs ! 的响应,但我似乎无法找到一种简单的方法将 JSON 对象解包到方法的属性中。

我知道正确的解决方案是在 HelloModel 中添加这两个属性,然后添加 [FromBody] 属性,但由于某些原因这是不可能的。

最佳答案

这是另一个(有点复杂的)选项。您可以创建自己的操作过滤器来拦截请求并根据自己决定的 JSON 使用值填充参数。例如:

public class JsonToParametersAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);

var stream = filterContext.HttpContext.Request.Body;
using (var sr = new StreamReader(stream))
using (var jsonTextReader = new JsonTextReader(sr))
{
var serializer = new JsonSerializer();
var body = serializer.Deserialize<JObject>(jsonTextReader);

if (body == null) return;

foreach (var parameter in filterContext.ActionDescriptor.Parameters)
{
var jsonProperty = body.Properties().SingleOrDefault(p => p.Name == parameter.Name);

if (jsonProperty != null)
{
var param = filterContext.ActionDescriptor.Parameters.OfType<ControllerParameterDescriptor>().FirstOrDefault(e => e.Name == parameter.Name);

if (param == null)
{
continue;
}

if (!filterContext.ActionArguments.ContainsKey(parameter.Name))
{
object value;

try
{
value = jsonProperty.Value.ToObject(param.ParameterInfo.ParameterType);
}
catch (Exception)
{
value = GetDefault(param.ParameterInfo.ParameterType);
}

filterContext.ActionArguments.Add(parameter.Name, value);
}
}
}
}
}
private static object GetDefault(Type type)
{
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}
}

现在用这个新属性装饰你的 Action 方法:

[HttpPost]     
[JsonToParameters]
public dynamic SayHello(string FirstName, string SecondName)
{
return $"Hello {FirstName} {SecondName} !";
}

关于c# - "Unwrapping"发布 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45711214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com