C#WebAPI没有正确地序列化动态属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#WebAPI没有正确地序列化动态属性相关的知识,希望对你有一定的参考价值。

我正在创建一个新的C#OData4 Web API,其中包含一个名为Call的类,它具有动态属性,OData 4允许通过“Open Types”。我相信我已经设置了所有内容并正确配置它,但序列化响应不包括动态属性。

我配置错了吗?

public partial class Call 
{
    public int Id { get; set; }
    public string Email { get; set; }
    public IDictionary<string, object> DynamicProperties { get; }
}

public class CallController : ODataController
{
    [EnableQuery]
    public IQueryable<Call> GetCall([FromODataUri] int key)
    {
        return _context.Call.GetAll();
    }
}

public static partial class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        AllowUriOperations(config);

        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.ComplexType<Call>();
        var model = builder.GetEdmModel();

        config.MapODataServiceRoute(RoutePrefix.OData4, RoutePrefix.OData4, model);    
    }

    private static void AllowUriOperations(HttpConfiguration config)
    {
        config.Count();
        config.Filter();
        config.OrderBy();
        config.Expand();
        config.Select();
    }
}
答案

您可以通过添加以下行来启用OData开放类型中的空值动态属性的序列化(在我的代码中,在方法Register(HttpConfiguration config)中的WebApiConfig.cs中)

    config.Properties.AddOrUpdate("System.Web.OData.NullDynamicPropertyKey", val=>true, (oldVal,newVal)=>true);

然后我的null动态属性开始序列化。

另一答案

你可以检查你的元数据,在类型Call你有OpenType="true"?如果没有,尝试将它变成EntitySet改变这一行:

builder.ComplexType<Call>();

对此

builder.EntitySet<Call>("Calls");

如果您的元数据中确实有OpenType="true",请检查您的DynamicProperties集合中是否有一些条目

另一答案

如果密钥对中的值是null,则该属性不会被序列化。我期待它被序列化

“key”:null

以下是一些其他示例

DynamicProperties.Add("somekey", 1);

“somekey”:1


DynamicProperties.Add("somekey", "1");

“somekey”:“1”


DynamicProperties.Add("somekey", null);

另一答案

或者可以使用configuration.SetSerializeNullDynamicProperty(true);,它更清洁,不言自明。

以上是关于C#WebAPI没有正确地序列化动态属性的主要内容,如果未能解决你的问题,请参考以下文章

WebAPI 2不反序列化List POST请求中FromBody对象的属性

正确地将片段插入和删除到 viewpager

带有选项字段的 F# 记录在 Asp.Net WebApi 2.x 应用程序中无法正确反序列化

如何正确地将多个片段添加到片段过渡?

如何有条件地将 C 代码片段编译到我的 Perl 模块?

Matlab类动态填充一个属性