我有一個要遷移的端點。發送到端點的 JSON 的當前格式是:
{
"settings":{
"Target":30,
"UserId":12345
}
}
目前有這樣的方法簽名......
public string GetTarget(Settings settings);
似乎 Web API 反序列化器正在尋找 JSON 格式如下(沒有頂級變數名稱):
{
"Target":30,
"UserId":12345
}
我有一個遺留應用程式,它發送帶有“設定”變數名稱的 JSON,但我無法更新它以發送未嵌套的格式。有什么方法可以讓 Web API 以“設定”中的嵌套屬性為目標?
uj5u.com熱心網友回復:
您可以嘗試使用自定義模型系結。這里是一個演示:
設定:
public class Settings {
public int Target { get; set; }
public int UserId { get; set; }
}
行動:
public string GetTarget([ModelBinder(BinderType = typeof(CustomBinder))] Settings settings)
自定義活頁夾:
public class CustomBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var model = new Settings();
using (var reader = new StreamReader(bindingContext.HttpContext.Request.Body))
{
var body = reader.ReadToEndAsync();
var mydata = JsonConvert.DeserializeObject<JObject>(body.Result);
model = JsonConvert.DeserializeObject<Settings>(mydata["settings"].ToString());
}
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
結果:

uj5u.com熱心網友回復:
試試這個,它是用 VS 和 Postman 測驗過的。它不需要任何自定義轉換器
using Newtonsoft.Json.Linq;
....
public string GetTarget([FromBody] JObject settingsObj)
{
Settings settings;
if (settingsObj["settings"] != null) settings = settingsObj["settings"].ToObject<Settings>();
else settings = settingsObj.ToObject<Settings>();
......
}
public class Settings
{
public int Target { get; set; }
public int UserId { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/397741.html
標籤:C# json 反序列化 asp.net-core-webapi
