gpt4 book ai didi

c# - 将 JSON 对象转换为 C# 模型 Web API 2

转载 作者:行者123 更新时间:2023-11-30 16:48:01 24 4
gpt4 key购买 nike

这是我使用 AngularJS 和 Web API 2 C# 后端的第 4 个生产级系统。我不是没有经验就来这里的,但是……我只是无法进行非常简单的转换。我通常在 Angular UI 和 Web API 2 后端之间使用复杂模型而没有问题,因为这太简单了,所以非常沮丧。

我在下面发布 JSON:

{
"appSelection": [
{
"name": "Withdrawal Service",
"selected": true
}
],
"dateSelection": {
"startDate": "2016-06-13T23:00:00.000Z",
"endDate": "2016-07-27T07:52:03.510Z"
},
"eventTypes": [
{
"name": "Fail",
"selected": true
},
{
"name": "Success",
"selected": true
}
]
}

到 Web API Controller :(为简洁起见进行了编辑)

        [HttpPost]
[Route("search")]
[ResponseType(typeof(ProcessLog[]))]
public async Task<IHttpActionResult> getLogs(LogRequest request)
{
string requestBody = string.Empty;
using (var stream = new MemoryStream())
{
var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
context.Request.InputStream.Seek(0, SeekOrigin.Begin);
context.Request.InputStream.CopyTo(stream);
requestBody = Encoding.UTF8.GetString(stream.ToArray());
}

它接受这个模型:

public class LogRequest
{
public DateViewModel DateSelection { get; set; }
public NameAndSelect[] appSelection { get; set; }
public NameAndSelect[] eventTypes { get; set; }
}

public class NameAndSelect
{
public bool selected { get; set; }
public string name { get; set; }
}
public class DateViewModel
{
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
}

requestBody 的输出是

{"appSelection":[{"name":"Withdrawal Service","selected":true}],"dateSelection":{"startDate":"2016-06-13T23:00:00.000Z","endDate":"2016-07-27T07:52:03.510Z"},"eventTypes":[{"name":"Fail","selected":true},{"name":"Success","selected":true}]}

这表明 JSON 已正确发布到 Web API Controller ,但自动模型绑定(bind)失败。请求对象(web api接收模型)为

DateSelection : null
appselection : null
eventTypes : null

我只是不明白为什么以及在哪里。已经尝试超过 2 天了!真的很感激一双新鲜的眼睛。

提前致谢

更新#1:

将模型更改为以下,自动绑定(bind)仍然失败

public class LogRequest
{
public DateViewModel DateSelection { get; set; }
public List<NameAndSelect> appSelection { get; set; }
public List<NameAndSelect> eventTypes { get; set; }
}

更新#2:

我尝试将模型简化为

public class LogRequestViewModel
{
public string testString { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public DateSelection dateselection { get; set; }
}
public class DateSelection
{
public string startDate { get; set; }
public string endDate { get; set; }
}

和发布:

{"teststring":"plap","startdate":"2016-07-27T09:28:38.404Z","enddate":"2016-07-27T09:28:38.404Z","dateselection"
:{"startdate":"2016-07-27T09:28:38.404Z","enddate":"2016-07-27T09:28:38.404Z"}}

我收到:

dateselection:null
enddate: {27/07/2016 10:28:38}
startdate: {27/07/2016 10:28:38}
teststring: "plap"

这表明它能够毫无问题地转换日期时间,但更深层次的对象会导致问题

最佳答案

感谢@Smoksnes,我注释掉了启动类和 App_Start 类中的所有 JSON 格式化程序。不幸的是,这并没有解决问题。当运行评论所有被注释掉的行时,我在我的 WebApiConfig.cs

中发现了以下内容
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
jsonFormatter.SerializerSettings.MaxDepth = 1;

底线! Doh。 评论 ALL JSON 格式化程序没有修复它,但是从这一行重新启用它们所有 APART 修复了它。我想我需要一些其他格式器的组合,但不是 MaxDepth 一个。

谢谢大家

关于c# - 将 JSON 对象转换为 C# 模型 Web API 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607220/

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