我在 .NET Web Api 项目中使用以下 C# OData 包:
安装包 Microsoft.AspNet.OData
安装包 Microsoft.AspNet.WebApi.OData
当遵循微软的例子时在 OData v4 中使用开放类型,只要开放类型不包含额外的嵌套开放复杂类型,一切似乎都会按预期工作。
这意味着这会正常工作:
public class WplController : ODataController
{
private List<AbstractMongoDocument> _documents = new List<AbstractMongoDocument>
{
new AbstractMongoDocument
{
Id = "2",
Meta = new MongoMeta(),
Data = new MongoData
{
Document = new Dictionary<string, object>()
{
{"root_open_type", "This works!" },
}
}
}
};
[EnableQuery]
public IQueryable<AbstractMongoDocument> Get()
{ return _documents.AsQueryable();}
}
虽然这会引发异常
public class WplController : ODataController
{
private List<AbstractMongoDocument> _documents = new List<AbstractMongoDocument>
{
new AbstractMongoDocument
{
Id = "1",
Meta = new MongoMeta(),
Data = new MongoData
{
Document = new Dictionary<string, object>()
{
{"root_open_type", "This works!" },
{"nested_open_type", new Dictionary<string, object>() //Nested dictionary throws exception!
{
{"field1", "value2" },
{"field2", "value2" }
}
}
}
}
}
};
[EnableQuery]
public IQueryable<AbstractMongoDocument> Get()
{ return _documents.AsQueryable();}
}
例外情况如下:
发生 System.InvalidOperationException
消息:“ObjectContent`1”类型无法序列化内容类型“application/json”的响应正文; odata.metadata=最小'。
消息:抛出异常:System.Web.OData.dll 中的“System.InvalidOperationException”
附加信息:给定模型不包含类型“System.Collections.Generic.Dictionary`2[System.String,System.Object]”。
可以通过将以下行添加到ODataConventionModelBuilder
in WebApiConfig.cs
:
builder.ComplexType<Dictionary<string, object>>();
但是,这会导致以下 OData 响应 JSON:
{
"@odata.context": "http://localhost:50477/odata/$metadata#wpl",
"value":
[
{
"Id": "1",
"Meta": {},
"Data":
{
"root_open_type": "This works!",
"nested_open_type":
{
"@odata.type": "#System.Collections.Generic.Dictionary_2OfString_Object",
"Keys":
[
"field1",
"field2"
]
}
}
}
]
}
如何确保 ODate 也正确序列化嵌套的开放字段? IE。我想要以下结果 OData JSON:
{
"@odata.context": "http://localhost:50477/odata/$metadata#wpl",
"value":
[
{
"Id": "1",
"Meta": {},
"Data":
{
"root_open_type": "This works!",
"nested_open_type":
{
"field1": "value1",
"field2": "value2"
}
}
}
]
}
预先感谢您提供任何可能的帮助!