次のアクション シグネチャを持つ 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 プロパティは常に null です。
SearchParameters Type を Xml Serialization 属性を持たない POCO に置き換えると、JSON で正常に動作します。これにより、JsonMediaTypeFormatter は xml シリアライゼーション属性のためにプロパティを正しく一致させることができないと考えるようになりました (XML ではなく JSON であるため、これは問題ではありませんが)。DataContract Serializer を使用するように JsonFormatter を変更しましたが、違いはありません。
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 メディア フォーマッタの動作が異なる原因は何ですか?