1

我有一个具有以下动作签名的 API 控制器...

[HttpPost]
public HttpResponseMessage DoSearch(SearchParameters parameters)

SearchParameters不是我可以修改的,反编译的源代码看起来像这样......

 [DebuggerStepThrough]
  [XmlRoot("SearchData", IsNullable = false, Namespace = "http://company.com/some/namespace/v1")]
  [GeneratedCode("xsd", "2.0.50727.3038")]
  [DesignerCategory("code")]
  [XmlType(Namespace = "http://company.com/some/namespace/v1")]
  [Serializable]
  public class SearchParameters
  {
    private string[] _searchCodes;

    [XmlArrayItem("SearchCode", IsNullable = false)]
    public string[] SearchCodes
    {
      get
      {
        return this._searchCodes;
      }
      set
      {
        this._searchCodes = value;
      }
    }
  }

我可以使用 XML 有效负载成功调用端点,但根本无法让 JSON 工作。SearchCodes 属性始终为空。

如果我将 SearchParameters 类型替换为没有任何 Xml 序列化属性的 POCO,则它适用于 JSON。这使我认为 JsonMediaTypeFormatter 由于 xml 序列化属性而无法正确匹配该属性(尽管这不重要,因为它的 JSON,而不是 XML,对吗?)。我更改了 JsonFormatter 以使用 DataContract Serializer,但这并没有什么区别。

httpConfiguration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;

我尝试制作不同的 JSON 结构,看看我是否可以“帮助”它理解,但这些都不起作用......

{
    "SearchData": {
        "SearchCodes": {
            "SearchCode": [
                "SYAA113F",
                "N0TEXI5T",
                "SYAA112C"
            ]
        }
    }
}


{
    "SearchCodes": {
        "SearchCode": [
            "SYAA113F",
            "N0TEXI5T",
            "SYAA112C"
        ]
    }
}

{
    "SearchCodes":  [
            "SYAA113F",
            "N0TEXI5T",
            "SYAA112C"
        ]
}


{
    "SearchData": {
        "SearchCode": [
            "SYAA113F",
            "N0TEXI5T",
            "SYAA112C"
        ]
    }
}


{
    "SearchCode": [
        "SYAA113F",
        "N0TEXI5T",
        "SYAA112C"
    ]
}

{
    "SearchCodes":  [
            { "SearchCode" : "SYAA113F" },
            { "SearchCode" : "SYAA113F" },
            { "SearchCode" : "SYAA113F" }
        ]
}

我该如何进一步调试?我错过了什么?由于 XML 属性,导致 JSON 媒体格式化程序的行为不同的原因是什么?

4

1 回答 1

1

发布此 JSON 并查看。

{"_searchCodes":[
        "SYAA113F",
        "N0TEXI5T",
        "SYAA112C"]
}

记得设置Content-Type: application/json

于 2013-09-02T16:19:17.290 回答