JSON 将对象反序列化为没有键名的模型

JSON DeserializeObject to Model without Key Name

我目前有 JSON 进来如下:

{"36879":[{"min_qty":1,"discount_type":"%","csp_price":10}],"57950":[{"min_qty":1,"discount_type":"flat","csp_price":650}]}

这包含以下记录的列表

ProductId 最小数量 折扣类型 价格

我需要将其反序列化为以下模型:

public class CustomerSpecificPricing
    {
        string productId { get; set; }
        public virtual List<CustomerSpecificPricingDetail> CustomerSpecificPricingDetails { get; set; }
    }
    public class CustomerSpecificPricingDetail
    {
        public string min_qty { get; set; }
        public string discount_type { get; set; }
        public string csp_price { get; set; }
    }

问题是每条记录的“productId”缺少键名。

如果我 运行 我的 JSON 通过 J2C,我得到以下信息:

public class 36879    {
    public int min_qty { get; set; } 
    public string discount_type { get; set; } 
    public int csp_price { get; set; } 
}

public class 57950    {
    public int min_qty { get; set; } 
    public string discount_type { get; set; } 
    public int csp_price { get; set; } 
}

public class Root    {
    public List<_36879> _36879 { get; set; } 
    public List<_57950> _57950 { get; set; } 
}

这显然是不正确的。

如何正确反序列化我的对象?

您需要先将其反序列化为字典,然后再将其映射为您需要的格式。这样的事情应该有效:

var dict = JsonConvert.DeserializeObject<Dictionary<string, IEnumerable<CustomerSpecificPricingDetail>>>();

var result = dict.Select(kvp => new CustomerSpecificPricing { ProductId = Int32.Parse(kvp.Key), CustomerSpecificPricingDetails = kvp.Value });

我也建议大家按照约定俗成的命名标准。在这种情况下,类 中的属性应该是 PascalCase,

例如你的 类 现在变成了:

public class CustomerSpecificPricing
{
   [JsonProperty("productId ")]
   public string ProductId { get; set; }
   public virtual List<CustomerSpecificPricingDetail> CustomerSpecificPricingDetails { get; set; }
}

public class CustomerSpecificPricingDetail
{
   [JsonProperty("min_qty")]
   public string MinQty { get; set; }
   [JsonProperty("discount_type ")]
   public string DiscountType { get; set; }
   [JsonProperty("csp_price ")]
   public string CspPrice { get; set; }
}