Web API 和应用程序/x-www-form-urlencoding JSON.

本文关键字:x-www-form-urlencoding JSON 应用程序 API Web | 更新日期: 2023-09-27 17:57:06

我正在研究一个从第三方来源接收数据的webhook。不幸的是,他们以非常奇怪和不当的方式向我发布数据。尽管如此,这就是我必须处理的问题。他们以以下格式发送内容类型为 application/x-www-form-urlencoded 的数据:

randomJsonObjects: 
[
  {
    "email": "john@example.com",
    "timestamp": 1337197600,
    "id": "55555",
  },
  {
    "email": "johnny@example.com",
    "timestamp": 1337547600,
    "id": "44444",
  }
]

当然,这不是有效的 JSON,但它也没有被这样发送。我的问题是我无法让 Web API 正确解析它。通常,对于 JSON,我只是将其用作我的控制器:

public HttpResponseMessage Create(List<MyObject> jsonObjects)

但这行不通。我尝试了许多选项,但总是以空值结束。

Web API 和应用程序/x-www-form-urlencoding JSON.

application/x-www-form-urlencoded编码的数据结构与 NameValueCollection 非常相似。

捕获查询字符串并尝试使用 HttpUtility.ParseQueryString 对其进行分析。此外,此 SO 可能会有所帮助

尝试查看以下内容是否符合您的需求...在这里,我做了一个很大的假设,即请求内容的格式总是像randomJsonObjects:[.....]一样,因此我尝试首先解析以查看它是否是有效的 json,如果不是,我将添加一个包装{}字符。

当然,这可以改进,以便您始终专门处理某些类型的参数(例如:在这种情况下AddressBook),因此您可能希望将以下逻辑写入类似HttpParameterBinding在这种情况下,无论在操作中使用此参数,都将使用以下解决方法...

public async Task Post()
{
    bool validJson = false;
    string originalData = await Request.Content.ReadAsStringAsync();
    try
    {
        JObject jo = JObject.Parse(originalData);
        validJson = true;
    }
    catch (JsonReaderException)
    {
    }
    string modifiedData = null;
    if (!validJson)
    {
        modifiedData = "{" + originalData + "}";
    }
    else
    {
        modifiedData = originalData;
    }
    AddressBook book = JsonConvert.DeserializeObject<AddressBook>(modifiedData);
    //TODO: do something with the book
}
public class AddressBook
{
    [JsonProperty("randomJsonObjects")]
    public IEnumerable<ContactInfo> Contacts { get; set; }
}
public class ContactInfo
{
    public string Email { get; set; }
    public long TimeStamp { get; set; }
    public string Id { get; set; }
}

你必须使用 newtonsoft.json

能够反序列化匿名对象和几乎所有json的东西去检出 : http://json.codeplex.com/

对于您的情况,我认为像这样的简单行就可以解决问题:

List<dynamic> randomJsonObjects= JsonConvert.DeserializeObject<List<dynamic>>(randomJsonObjects);

问题 si 您的代码由 randomJsonObjects 开始:所以你只需要删除它并在调用上面的行之后。或添加 { } 将其转换为对象