我有一个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值