如何在 ASP.NET Core 中编码 JSON Url

How to encode JSON Url in ASP.NET Core

我想对 API 进行 post,而我用来进行 post 调用的 link 有一些 URL参数.

Link 使 post: http:///someservice/api/v1/requests?input_data=encoded_data

参数(input_data)是一个JSON,需要先编码。 当我使用此 link 对下面的 JSON 进行编码,并将编码结果添加到 URL 并使用 Postman 制作 post 时,它工作得很好。

{
   "request":{
      "requester":{
         "email_id":"**phx@phx.com**"
      },
      "subject":"**subject**",
      "description":"**description something**"
   }
}

这是我的方法:

[HttpPost]
[Route("projectRequest")]
[Consumes("multipart/form-data")]
public IActionResult CreateConfig([FromForm] ConfigInputModel model) {
    try {
        var json =
            "{" +
                "\"request\":{ " + 
                "\"requester\":{ " + 
                    "\"email_id\" : \" " + model.Requester + " \" " +
                "}," +
                "\"subject\":\" " + model.Subject + " \" \", " +
                "\"description\":\" " + model.Description + " \" \" " +
                "}" +
            "}";

        HttpClient httpClient = new HttpClient();

        Encoding utf16le = new UnicodeEncoding(bigEndian: false, byteOrderMark: true,throwOnInvalidBytes: true);
        HttpContent content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(json));
        
        var postResponse = httpClient.PostAsync("http://someservice/api/v1/requests?input_data=" +
                                     System.Web.HttpUtility.UrlEncode(json), content);
        
        return Ok(postResponse.Result);
    } catch (Exception e) {
        return NotFound();
    }
}

我的问题是如何编码 JSON 变量,因为我得到

"Unable to parse the JSON"

来自 API 的回复。我怀疑我所拥有的 JSON 字符串中的转义字符导致了它,但很长一段时间都无法弄清楚。谢谢。

我在我这边测试了你的代码,当我使用 JObject jsonObj = JObject.Parse(json); 传输你的 json 字符串时,我得到了关于 request.subjectrequest.description 的错误,

然后我发现你这个地方写错了,你把我在下面截图里标注的去掉。

而不是将 JSON 写成字符串,建议 将数据设置为 object 与 POCO classanonymous type.接下来,将其序列化为 JSON 字符串。

好处:避免JSON语法错误。

anonymous type

var json = new {
    request = new {
        requester = new {
            email_id = model.Requester
        }
    },
    subject = model.Subject,
    description = model.Description
};
        
Console.WriteLine(JsonConvert.SerializeObject(json));

Sample program

Output

{"request":{"requester":{"email_id":"Requester"}},"subject":"Subject","description":"Description"}