C# 序列化为JSON时有条件地更改某些属性的类型
我有一个自定义类,我正在使用JSON.NET序列化它。 在该类中,我们将其称为C# 序列化为JSON时有条件地更改某些属性的类型,c#,.net,json.net,C#,.net,Json.net,我有一个自定义类,我正在使用JSON.NET序列化它。 在该类中,我们将其称为posInvoice,我有一些属性,例如UnitPrice、Quantity、以及TotalAmount,它们的类型为string。当我将序列化对象作为POST请求发送到端点时,这种方法可以很好地工作 现在我有了另一个端点,它接受相同的类,posInvoice。但是,该端点希望这些值改为小数 在我的代码中处理这个问题的最佳方法是什么?我应该创建另一个类并更改属性类型吗?我已经研究并试图在堆栈溢出中寻找类似的情况,但没有
posInvoice
,我有一些属性,例如UnitPrice
、Quantity
、以及TotalAmount
,它们的类型为string。当我将序列化对象作为POST请求发送到端点时,这种方法可以很好地工作
现在我有了另一个端点,它接受相同的类,posInvoice
。但是,该端点希望这些值改为小数
在我的代码中处理这个问题的最佳方法是什么?我应该创建另一个类并更改属性类型吗?我已经研究并试图在堆栈溢出中寻找类似的情况,但没有找到任何结果 以下是我将采取的方法:
PosInvoice
类,因为小数是金额最合适的数据类型public class PosInvoice
{
public string Description { get; set; }
public decimal UnitPrice { get; set; }
public decimal Quantity { get; set; }
public decimal TotalAmount { get; set; }
}
转换器:
public class InvoiceAmountsAsStringsConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(PosInvoice);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
PosInvoice invoice = (PosInvoice)value;
JsonObjectContract contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(typeof(PosInvoice));
writer.WriteStartObject();
foreach (JsonProperty prop in contract.Properties)
{
writer.WritePropertyName(prop.PropertyName);
object propValue = prop.ValueProvider.GetValue(invoice);
if (propValue is decimal)
{
writer.WriteValue(((decimal)propValue).ToString(CultureInfo.InvariantCulture));
}
else
{
serializer.Serialize(writer, propValue);
}
}
writer.WriteEndObject();
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
用法:
public static string SerializeInvoice(PosInvoice invoice, bool serializeDecimalsAsStrings)
{
var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };
if (serializeDecimalsAsStrings)
{
settings.Converters.Add(new InvoiceAmountsAsStringsConverter());
}
return JsonConvert.SerializeObject(invoice, settings);
}
这里的工作演示:您不能将相同的json传递到另一个端点?完全相同的json,只是某些类型将是十进制的,而不是字符串