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

标签 c# json.net

<分区>

有没有办法在一次操作中序列化一个从小数到小数[]的Json对象属性?

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

[
    {
        "product" : "umbrella",
        "price" : 10.50,
    },
        "product" : "chainsaw",
        "price" : [
                      39.99,
                      20.0
                    ]
    }
]

让它工作的唯一方法是将属性设为对象,如下所示:

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

var productList = JsonConvert.DeserializeObject<List<Product>>(jsonArray);

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

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

最佳答案

您必须为该 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();
        }
    }

然后正常解析:

 var productList = JsonConvert.DeserializeObject<List<Product>>(jsonStr);

关于c# - 序列化有时是数组的 Json 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30147272/

相关文章:

c# - Request.Url.Host 是否包含子域?

c# - 为azure函数设置不同的计时器属性

c# - 使用 json.net 反序列化时是否保留数组顺序?

C# Json.NET WCF Rest 日期时间格式

c# - 类型为 'Newtonsoft.Json.Linq.JObject' 的对象无法转换为类型

c# - 使用 .Net Reactor 时未知的自定义元数据项类型 7

c# - Telerik RadWindow

c# - 结合两个 LINQ 查询的优雅方式

c# - 将具有多个数据表的数据集转换为 Json

c# - 使用 Json.NET 从 JSON 文件获取数据并使用 T4 文本模板创建 c-sharp 文件