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)
但这行不通。我尝试了许多选项,但总是以空值结束。
用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 开始:所以你只需要删除它并在调用上面的行之后。或添加 { } 将其转换为对象