【问题标题】:Receiving the key value pair as input parameter接收键值对作为输入参数
【发布时间】:2017-11-16 15:21:55
【问题描述】:

我正在尝试接收以下键值对作为我的 Web API 的输入参数

json=%7B%0A%22MouseSampleBarcode%22%20%3A%20%22MOS81%22%0A%7D%0A

字符串的右边是 URL 编码的 JSON,看起来像

{
"MouseSampleBarcode" : "MOS81"
}

我怎样才能解析这个并将它们存储到模型类中

 [HttpPost]
 public async Task<IHttpActionResult> Get([FromBody] CoreBarCodeDTO.RootObject coreBarCode)
 {
  string Bar_Code = coreBarCode.MouseSampleBarcode.ToString();

CoreBarCodeDTO 如下所示

public class CoreBarCodeDTO
{
    public class RootObject
    {
        public string MouseSampleBarcode { get; set; }
    }
 }

【问题讨论】:

  • Get 没有正文。
  • 最简单的方法是删除json=... 并用适当的参数替换它。这对你来说可能吗?
  • @Lokki 在 Get 中获得了 [HttpPost]。但是 URL 编码的 JSON 是如何被解码的,以及如何处理 json=
  • 您的控制器正在接收表单 url 编码的内容,该内容不会反序列化为 CorBarCodeDTO,因为它没有名为 json 的属性。您可以考虑在控制器中接受 FormDataCollection 参数,然后解码和反序列化 json 键的值。
  • @ViRuSTriNiTy 我无法控制它。 URL编码的JSON如何解码以及如何处理json=

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


【解决方案1】:

你可以这样做。将您的课程更改为此定义。在您的控制器 coreBarCode.json 中将包含 json,然后您可以根据需要使用它:

public class CoreBarCodeDTO
{
    private string _json;
    public string json { get { return _json; }
        set {
            string decoded = HttpUtility.UrlDecode(value);
            _json = decoded;
        }
    }
}

更新

 [HttpPost]
 public async Task<IHttpActionResult> Get([FromBody] CoreBarCodeDTOcoreBarCode coreBarCode)
 {
    string Bar_Code = coreBarCode.json;
    //work with the JSON here, with Newtonsoft for example
    var obj = JObject.Parse(Bar_Code);
    // obj["MouseSampleBarcode"] now = "MOS81"

 }

【讨论】:

  • 这里的coreBarCode是什么?可能是我有点困惑
  • 这是你的控制器的参数。
  • 另外我如何在这里访问 MOS81 作为字符串?
  • 没有单一的方法,但我更新了一个使用 Newtonsoft 解析 JSON 的示例,您可能需要添加对它的引用。
【解决方案2】:

正如@Lokki 在他的评论中提到的那样。 GET 动词没有正文,您需要将其更改为 POST 或 PUT(取决于您是创建/搜索还是更新),因此您的代码如下所示:

[HttpPost("/")]
public async Task<IHttpActionResult> Get([FromBody] CoreBarCodeDTO.RootObject coreBarCode)
{ 
   string Bar_Code = coreBarCode.MouseSampleBarcode.ToString();

【讨论】:

  • 我在粘贴时错过了。我有 [HttpPost] 即使那样它也不起作用
【解决方案3】:

所以,正如我所说:Get 没有主体。
关注@KinSlayerUY 的回答。

[HttpPost("/")]
public async Task<IHttpActionResult> Post([FromBody] CoreBarCodeDTO.RootObject coreBarCode)
{ 
   string Bar_Code = coreBarCode.MouseSampleBarcode.ToString();
   ...
}


如果您需要使用 GET 删除 [FromBody] 属性并将数据作为单个参数发送

[HttpGet("/")]
public async Task<IHttpActionResult> Get(string mouseSampleBarcode)
{ 
   var rootObject = new CoreBarCodeDTO.RootObject
   {
        MouseSampleBarcode = mouseSampleBarcode
   }
   ...
}

【讨论】:

  • OP 在命名方面违反了约定,但这不是问题。
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 2018-03-24
  • 2021-04-19
  • 1970-01-01
  • 2016-10-30
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多