序列化有时是数组的Json属性

Gue*_*lla 10 c# json.net

有没有办法在单个操作中序列化从十进制到十进制[]的Json对象属性?

在我的Json产品Feed中,特价商品表示为数组(正常价格/促销价).普通商品只是价格.像这样:

[
    {
        "product" : "umbrella",
        "price" : 10.50,
    },
        "product" : "chainsaw",
        "price" : [
                      39.99,
                      20.0
                    ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我可以让它工作的唯一方法是,如果我将属性设置为这样的对象:

public class Product
{
    public string product { get; set; }
    public object price { get; set; }
}

var productList = JsonConvert.DeserializeObject<List<Product>>(jsonArray);
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使其为decimal [],那么它将在单个十进制值上抛出异常.使它成为一个对象意味着数组值是一个JArray所以我以后必须做一些清理工作,我的应用程序中的其他映射要求属性类型是准确的所以我必须将其映射到未映射的属性然后初始化另一个属性没什么大不了的,但命名有点混乱.

对象是这里唯一的选择还是我可以使用序列化程序做一些魔术,要么将单个值添加到数组,要么将第二个值添加到单独的属性以获得特价?

nha*_*duc 19

你必须为该price属性编写一个自定义转换器(因为它的格式不正确),并使用如下:

 public class Product
    {
        public string product { get; set; }
        [JsonConverter(typeof(MyConverter ))]
        public decimal[] price { get; set; }
    }


 public class MyConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return false;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if(reader.TokenType == JsonToken.StartArray)
            {
                return serializer.Deserialize(reader, objectType);
            }
            return new decimal[] { decimal.Parse(reader.Value.ToString()) };              
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后正常解析:

 var productList = JsonConvert.DeserializeObject<List<Product>>(jsonStr);
Run Code Online (Sandbox Code Playgroud)