【问题标题】:Json Value doesn't assign to the List [HttpPost]Json 值未分配给列表 [HttpPost]
【发布时间】:2018-09-06 11:22:40
【问题描述】:

由于是 Web api 的新手,我发现将 json List 发布到 Web API 时有些困难。

Json
[  
   {  
      "ItemId":20,
      "RegId":"VISIT0001778",
      "BLoadDetailId":"8/31/2018 12:28:10 PM",
      "OrderReferenceNo":null,
      "StartTime":"0001-01-01T00:00:00",
      "InvalidItemMsg":"",
      "InvalidItemstatus":false,
      "BLoadingBay":"Chute 009",
      "BLoadingBayCode":null,
      "BLoadingBayID":7,
      "RFID":7123,
      "GangId":2,
      "BOrderTransfer":false,
      "BLoadedBags":0.0,
      "BRemainingBags":0.0,
      "BConversionValue":null,
      "WHid":2
   }
]

类:

 public class clsStartTimeUpdate
 {
     public int ItemId { get; set; }
     public string RegId { get; set; }
     public string BLoadDetailId { get; set; }
     public string OrderReferenceNo{ get; set; }
     public DateTime StartTime { get; set; }
     public string InvalidItemMsg { get; set; }
     public bool InvalidItemstatus { get; set; }
     public string BLoadingBay { get; set; }
     public string BLoadingBayCode { get; set; }
     public int? BLoadingBayID { get; set; }
     public long? RFID { get; set; }
     public int? GangId { get; set; }
     public bool BOrderTransfer { get; set; }
     public decimal BLoadedBags { get; set; }
     public decimal BRemainingBags { get; set; }
     public string BConversionValue { get; set; }
     public int? WHid { get; set; }
 }

json请求

http://localhost:49290/api/config/Post?StartTimeDetails=[enter image description here][1][{%22ItemId%22:20,%22RegId%22:%22VISIT0001778%22,%22BLoadDetailId%22:%228/31/2018%2012:28:10%20PM%22,%22OrderReferenceNo%22:null,%22StartTime%22:%222001-01-01T00:00:00%22,%22InvalidItemMsg%22:%22%22,%22InvalidItemstatus%22:false,%22BLoadingBay%22:%22Chute%20009%22,%22BLoadingBayCode%22:null,%22BLoadingBayID%22:7,%22RFID%22:7123,%22GangId%22:2,%22BOrderTransfer%22:false,%22BLoadedBags%22:0.0,%22BRemainingBags%22:0.0,%22BConversionValue%22:null,%22WHid%22:2}]

方法 WebAPI

[HttpPost]
public HttpResponseMessage Post([FromUri]List<clsStartTimeUpdate> StartTimeDetails)
{          
    return base.BuildSuccessResult(HttpStatusCode.OK, StartTimeDetails);
}

结果:

[{"ItemId":0,"RegId":null,"BLoadDetailId":null,"OrderReferenceNo":null,"StartTime":"0001-01-01T00:00:00","InvalidItemMsg":null,"InvalidItemstatus":false,"BLoadingBay":null,"BLoadingBayCode":null,"BLoadingBayID":null,"RFID":null,"GangId":null,"BOrderTransfer":false,"BLoadedBags":0.0,"BRemainingBags":0.0,"BConversionValue":null,"WHid":null}]

返回结果不会像 Json 中那样分配值。 可能这是一个简单的情况,但我真的很感激帮助。

【问题讨论】:

  • 是方法中的参数问题还是返回值的问题?您是否调试过代码以查看 StartTimeDetails 开始时是否正确?
  • 你确定你 可以 像这样将 json 填充到 url 中吗?把json内容放到请求体中不是更好吗?
  • 你试过了吗[FromBody]
  • Json 参数被正确识别到 Web api,尽管 Json 参数值没有分配给 List (List StartTimeDetails) web api 方法
  • ershoaib : application-json

标签: c# json asp.net-web-api


【解决方案1】:

您似乎想用HttpGet 请求而不是HttpPost 来传达您的json,那么您可以在下面进行操作,

1) 使用 HttpGet 发送 Json

方法:Get

网址:http://localhost:49290/api/config/MyGet?StartTimeDetails=[{%22ItemId%22:20,%22RegId%22:%22VISIT0001778%22,%22BLoadDetailId%22:%228/31/2018%2012:28:10%20PM%22,%22OrderReferenceNo%22:null,%22StartTime%22:%220001-01-01T00:00:00%22,%22InvalidItemMsg%22:%22%22,%22InvalidItemstatus%22:false,%22BLoadingBay%22:%22Chute%20009%22,%22BLoadingBayCode%22:null,%22BLoadingBayID%22:7,%22RFID%22:7123,%22GangId%22:2,%22BOrderTransfer%22:false,%22BLoadedBags%22:0.0,%22BRemainingBags%22:0.0,%22BConversionValue%22:null,%22WHid%22:2}]

Web API 方法:

[HttpGet]
public HttpResponseMessage MyGet(string StartTimeDetails)
{
    List<clsStartTimeUpdate> clsStartTimeUpdates = JsonConvert.DeserializeObject<List<clsStartTimeUpdate>>(StartTimeDetails);
    return base.BuildSuccessResult(HttpStatusCode.OK, StartTimeDetails);
}

注意:在查询字符串中发送大量 json 是不好的做法,因此请改用 HttpPost

2) 使用 HttpPost 发送 Json

方法Post

网址: http://localhost:49290/api/config/MyPost

数据:

[  
   {  
      "ItemId":20,
      "RegId":"VISIT0001778",
      "BLoadDetailId":"8/31/2018 12:28:10 PM",
      "OrderReferenceNo":null,
      "StartTime":"0001-01-01T00:00:00",
      "InvalidItemMsg":"",
      "InvalidItemstatus":false,
      "BLoadingBay":"Chute 009",
      "BLoadingBayCode":null,
      "BLoadingBayID":7,
      "RFID":7123,
      "GangId":2,
      "BOrderTransfer":false,
      "BLoadedBags":0.0,
      "BRemainingBags":0.0,
      "BConversionValue":null,
      "WHid":2
   }
]

Web API 方法:

[HttpPost]
public HttpResponseMessage MyPost([FromBody]List<clsStartTimeUpdate> StartTimeDetails)
{
    return base.BuildSuccessResult(HttpStatusCode.OK, StartTimeDetails);
}

【讨论】:

  • @Udk,查看答案可能对您有帮助,如果然后接受答案并通过单击向上箭头进行投票来回答:)
  • @Udk,你不接受我的回答有什么问题吗?告诉我,我会尽力解决你的问题:)
  • 很高兴看到您摆脱了问题,我的回答对您有所帮助:)
  • 不,它是正确的。我不确定是否使用组件进行投票。希望现在可以了。
【解决方案2】:

对于复杂类型,始终在参数中使用 [FromBody]。

[HttpPost]
public HttpResponseMessage Post([FromBody]List<clsStartTimeUpdate> StartTimeDetails)
{          
    return base.BuildSuccessResult(HttpStatusCode.OK, StartTimeDetails);

}

然后在 Body 中指定你的查询对象。

注意:要在正文中指定值,您需要一个 API 客户端,如 Postman 或 Swagger。 https://www.getpostman.com/

在邮递员中,

选择 Post 方法并指定 URL, 然后转到“Body”选项卡并选择 raw。 指定 JSON 作为类型。 在正文中,粘贴您的数据。

   { [
     {
        "ItemId":20,
        ..........
     }
    ]}

@ershoaib 的另一个答案是真正解决 OP 面临的问题。但是,我将留下这个答案,因为它是应该遵循的标准。

【讨论】:

  • 我确实使用了 [FromBody] 但列表将 public HttpResponseMessage Post([FromBody]List StartTimeDetails) 分配为 null,以及如何在正文中指定查询对象。可以举个例子吗?
  • 你是使用swagger还是postman作为客户端进行查询,或者你的客户端是干什么的
  • 考虑在您的 chrome 中安装邮递员。然后运行查询。在那里你可以选择通过身体。
  • 我使用 Postman 查看请求详细信息和错误,但从未运行过查询,我正在查看示例,但不确定运行查询的方式。你能不能也给点建议。
  • 从我的回答中删除 json 字母
【解决方案3】:

由于您使用的是 post,因此您应该期望控制器方法中的数据来自 body。查看相关问题here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多