我有一个Azure函数,由http请求触发.在该函数中,我以xml格式从soap web服务获取数据,与我创建的用于存储该数据的类相比,该类具有不同的属性名称.因此,我为类属性指定了JsonProperty名称,但是我希望用类属性名称而不是json属性名称序列化我的类.为此,我创建了自定义契约解析器,但我不知道如何指定用于自动序列化的契约解析器(我的意思是当数据自动序列化以用于http响应时).

我的班级:

public class WaybillHeader
{
    [JsonProperty(PropertyName = "ID")]
    public int Id { get; set; }

    [JsonProperty(PropertyName = "TYPE")]
    public int Type { get; set; }

    [JsonProperty(PropertyName = "CREATE_DATE")]
    public DateTime CreateDateTime { get; set; }

    [JsonProperty(PropertyName = "BUYER_TIN")]
    public string BuyerTin { get; set; } = default!;

    [JsonProperty(PropertyName = "BUYER_NAME")]
    public string BuyerName { get; set; } = default!;

    [JsonProperty(PropertyName = "START_ADDRESS")]
    public string StartAddress { get; set; } = default!;

    [JsonProperty(PropertyName = "END_ADDRESS")]
    public string EndAddress { get; set; } = default!;

    [JsonProperty(PropertyName = "DRIVER_TIN")]
    public string DriverTin { get; set; } = default!;

    [JsonProperty(PropertyName = "DRIVER_NAME")]
    public string DriverName { get; set; } = default!;

    [JsonProperty(PropertyName = "TRANSPORT_COAST")]
    public decimal TransportationCost { get; set; }

    [JsonProperty(PropertyName = "DELIVERY_DATE")]
    public DateTime DeliveryDateTime { get; set; }

    [JsonProperty(PropertyName = "STATUS")]
    public int Status { get; set; }

    [JsonProperty(PropertyName = "ACTIVATE_DATE")]
    public DateTime ActivationDateTime { get; set; }

    [JsonProperty(PropertyName = "FULL_AMOUNT")]
    public decimal FullAmount { get; set; }

    [JsonProperty(PropertyName = "CAR_NUMBER")]
    public string CarNumber { get; set; } = default!;

    [JsonProperty(PropertyName = "WAYBILL_NUMBER")]
    public string WaybillNumber { get; set; } = default!;

    [JsonProperty(PropertyName = "CLOSE_DATE")]
    public DateTime CloseDateTime { get; set; }

    [JsonProperty(PropertyName = "S_USER_ID")]
    public string ServiceUserId { get; set; }

    [JsonProperty(PropertyName = "BEGIN_DATE")]
    public DateTime BeginDateTime { get; set; }

    [JsonProperty(PropertyName = "IS_CONFIRMED")]
    [JsonConverter(typeof(StrToBoolConverter))]
    public bool IsConfirmed { get; set; }

    [JsonProperty(PropertyName = "INVOICE_ID")]
    public int InvoiceId { get; set; }

    [JsonProperty(PropertyName = "IS_CORRECTED")]
    [JsonConverter(typeof(StrToBoolConverter))]
    public bool IsCorrected { get; set; }

    [JsonProperty(PropertyName = "BUYER_ST")]
    public int BuyerStatus { get; set; }
}

自定义合同解析程序:

public class CustomContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, 
    MemberSerialization memberSerialization)
    {
        var property = 
        base.CreateProperty(member,memberSerialization);

        property.PropertyName = member.Name;
    
        return property;
    }
}

编辑:

我有一个自定义转换器,可以将"0"和"1"转换为布尔值,我try 的是(它工作了,但我认为这不是一个合适的解决方案),我以书面形式向序列化程序提供了CustomContractResolver,如下所示:

public class StrToBoolConverter : JsonConverter<bool>
{
    public override void WriteJson(JsonWriter writer, bool value, 
    JsonSerializer serializer)
    {
        serializer.ContractResolver = new CustomContractResolver();
        writer.WriteValue(value);
    }

    public override bool ReadJson(JsonReader reader, Type objectType,             
    bool existingValue, bool hasExistingValue, JsonSerializer 
    serializer)
    {
        if (reader.Value == null)
            return false;

        if (reader.ValueType != typeof(string))
            return false;

        return reader.Value.ToString() switch
        {
            "0" => false,
            "1" => true,
            _ => false
        };
    }
}

此解决方案适用于除第一个值外的每个序列化WaybillHeader值

推荐答案

我将从c属性中删除所有JsonProperty属性,并创建一个用于反序列化的构造函数

public class WaybillHeader
{
    public int Id { get; set; }

    public int Type { get; set; }

    [JsonProperty(PropertyName = "CreateDateTime")] // You can remove it,
                                               // or give the name for serialization 
                                              // if you need a different one
    public DateTime CreateDateTime { get; set; }

    .....

     [Newtonsoft.Json.JsonConstructor]
    public class WaybillHeader(int ID, int TYPE, DateTime CREATE_DATE, ...)
   {
        Id=ID;
        Type=TYPE;
        CreateDateTime=CREATE_DATE;
        .....
    }
 
}

Csharp相关问答推荐

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

EF Core. Income和. AsNoTracking正确用法

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

共享暂存/生产环境中Azure事件中心的建议配置

Blazor Web App WASM的两个独立项目令人困惑

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

在C#中,是否有与变量DISARD对应的C++类似功能?

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

在使用UserManager时,如何包含与其他实体的关系?

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

如何使用EPPlus C#在单个单元格中可视化显示多行文字

如何正确处置所有动态控件?

C#如何获取字符串中引号之间的文本?

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

如何更改Datagridview行标题

实体框架允许您具有筛选的属性吗?

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.

C#11/.NET 7-判断&t;值类型>;后的可为空性行为