Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化为JSON时有条件地更改某些属性的类型_C#_.net_Json.net - Fatal编程技术网

C# 序列化为JSON时有条件地更改某些属性的类型

C# 序列化为JSON时有条件地更改某些属性的类型,c#,.net,json.net,C#,.net,Json.net,我有一个自定义类,我正在使用JSON.NET序列化它。 在该类中,我们将其称为posInvoice,我有一些属性,例如UnitPrice、Quantity、以及TotalAmount,它们的类型为string。当我将序列化对象作为POST请求发送到端点时,这种方法可以很好地工作 现在我有了另一个端点,它接受相同的类,posInvoice。但是,该端点希望这些值改为小数 在我的代码中处理这个问题的最佳方法是什么?我应该创建另一个类并更改属性类型吗?我已经研究并试图在堆栈溢出中寻找类似的情况,但没有

我有一个自定义类,我正在使用JSON.NET序列化它。 在该类中,我们将其称为
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,只是某些类型将是十进制的,而不是字符串