【发布时间】:2016-09-25 17:18:10
【问题描述】:
在这个简单的示例中,我试图从 Web Api 2 + OData v4 服务中获取序列化为 JSON 的对象。控制器具有绑定函数 Test,它返回一个 annon 数组。对象。
public class ProductsController : ODataController
{
[HttpGet]
public IHttpActionResult Test(int key)
{
var res = new[]
{
new { Name = "a", Value = new[] { 1, 2, 3 } },
new { Name = "b", Value = new[] { 2, 4, 5 } }
// this also produces same result
// new { Name = "a", Value = "c" },
// new { Name = "b", Value = "c" }
};
return this.Ok(res);
}
}
Edm 就是用这段代码构建的:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
var productType = builder.EntityType<Product>();
var f = productType.Function("Test").Returns<object>();
当我向服务发出请求时(例如http://localhost:9010/odata/Products(33)/Default.Test),我收到一个奇怪的响应 - 一个由两个空对象组成的数组,如下所示:
{
"@odata.context": "http://localhost:9010/odata/$metadata#Collection(System.Object)",
"value": [
{},
{}
]
}
在我的真实应用程序中,我使用 Newtonsoft 的 Json 转换器将对象序列化为 JSON 字符串 - 效果很好,但这个问题仍然困扰着我。我怀疑这与 OData 的默认序列化程序有关,但我不清楚如何配置它。
那么,是否可以通过配置 edm 函数的返回参数来正确序列化复杂对象?
谢谢!
【问题讨论】:
-
我不认为 odata 旨在与这样的匿名类型一起使用,但我没有足够的信心将其发布为答案!我认为您需要定义一个类型,将其添加到您的模型构建器(并将 Returns
-
我忘了提 - 即使我声明了一些类型然后 .Returns
(),结果是一样的:\
标签: json asp.net-web-api2 odata asp.net-web-api-odata odata-v4