2015-05-10 16 views
9

Có cách nào để tuần tự hóa thuộc tính đối tượng Json thay đổi từ thập phân sang thập phân [] trong một thao tác đơn lẻ không?Nối tiếp thuộc tính Json đôi khi là một mảng

Trong các mục ưu đãi đặc biệt của nguồn cấp dữ liệu sản phẩm Json của tôi được trình bày dưới dạng mảng (giá thông thường/giá bán). Các mặt hàng bình thường chỉ là giá. Cũng giống như vậy:

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

Cách duy nhất tôi có thể lấy nó để làm việc là nếu tôi có tài sản một đối tượng như vậy:

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

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

Nhưng nếu tôi cố gắng để làm cho nó thập phân [] sau đó nó sẽ ném ngoại lệ trên một giá trị thập phân đơn. Làm cho nó trở thành một đối tượng có nghĩa là các giá trị mảng là một JArray vì vậy tôi phải làm một số công việc dọn dẹp sau đó và ánh xạ khác trong ứng dụng của tôi yêu cầu loại thuộc tính phải chính xác, vì vậy tôi phải ánh xạ nó tới một thuộc tính chưa được ánh xạ. không phải là vấn đề lớn nhưng hơi lộn xộn với việc đặt tên.

Đối tượng là tùy chọn duy nhất ở đây hoặc có một số phép thuật tôi có thể làm với bộ nối tiếp thêm giá trị đơn vào mảng hoặc giá trị thứ hai cho thuộc tính riêng biệt cho giá ưu đãi đặc biệt?

+0

Thay vì sử dụng 'object' thử 'năng động 'ie' giá năng động công cộng {get; bộ; } ' –

Trả lời

14

Bạn phải viết một bộ chuyển đổi tùy chỉnh cho price tài sản (vì nó không phải ở định dạng tốt), và sử dụng như thế này:

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(); 
     } 
    } 

Và sau đó phân tích như bình thường:

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

Bạn có phải xác định thuộc tính trên kiểu nếu bạn đang gửi' MyConverter() 'làm tham số trên phương thức deserialize không? –

+0

trang nhã! thích nó :) –

+0

điều này thật đáng yêu! –

3

Một cách để làm điều này là thêm một trường Json là dynamic và đánh dấu nó với thuộc tính JsonProperty để nó xếp hàng với/Json thực tế. Sau đó có lĩnh vực thực sự trong .NET mà sẽ đi mà lĩnh vực Json và dịch nó thành một mảng thực như vậy ...

using System; 
using System.Linq; 
using System.Collections.Generic; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     var json = "{ \"price\": [ 10, 20 ] }"; 
     var json2 = "{ \"price\": 15 }"; 

     var foo1 = JsonConvert.DeserializeObject<Foo>(json); 
     var foo2 = JsonConvert.DeserializeObject<Foo>(json2); 

     foo1.Price.ForEach(Console.WriteLine); 
     foo2.Price.ForEach(Console.WriteLine); 
    } 
} 

public class Foo { 
    [JsonProperty(PropertyName = "price")] 
    public dynamic priceJson { get; set; } 

    private List<int> _price; 

    public List<int> Price { 
     get { 
      if (_price == null) _price = new List<int>(); 

      _price.Clear(); 

      if (priceJson is Newtonsoft.Json.Linq.JArray) { 

       foreach(var price in priceJson) { 
        _price.Add((int)price); 
       } 
      } else { 
       _price.Add((int)priceJson); 
      } 

      return _price; 
     } 
    } 
} 

Sống mẫu tại địa chỉ: https://dotnetfiddle.net/ayZBlL

+0

Thanks !. Tôi đã sử dụng kết hợp phương pháp này và công cụ chuyển đổi tùy chỉnh – Guerrilla

Các vấn đề liên quan