【问题标题】:Web API and application/x-www-form-urlencoded JSONWeb API 和应用程序/x-www-form-urlencoded JSON
【发布时间】:2014-05-19 23:35:51
【问题描述】:

我正在开发一个从第三方来源接收数据的 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)

但这不起作用。我尝试了很多选项,但总是以空值结束。

【问题讨论】:

  • 其实你的数据有效的JSON

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


【解决方案1】:

你必须使用 newtonsoft.json

可以反序列化匿名对象和几乎所有 json 的东西 去看看:http://json.codeplex.com/

对于你的情况,我认为这样一条简单的线就可以解决问题:

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

问题在于您的代码以 randomJsonObjects: 开头,因此您只需删除它并在调用上面的行之后。 或添加 { } 将其转换为对象

【讨论】:

  • 我不太确定文本是有效的 Json 格式。尝试将其粘贴到 JSParse 失败。
  • 不是,这绝对是问题的根源。如果它是有效的 JSON,我可以让它正常工作,但不幸的是,我无法控制发布给我的内容。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    尝试看看以下内容是否符合您的需求...这里我做了一个很大的假设,即请求内容的格式总是像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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2016-09-07
      • 1970-01-01
      • 2018-10-19
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多