2017-10-15 273 views
0

我需要將以下JArray轉換爲對象。 我的問題是,我需要用屬性來做到這一點。 因爲我不能夠改變以下調用處於分離類:將JArray轉換爲具有屬性的對象

var message = JsonConvert.DeserializeObject(e.Message, messageType) 

的JSON

[71,[[77372266,1508067366000,-0.12144759,5517.4],[77372265,1508067366000,-0.020001,5518.2],[77372251,1508067362000,-0.01,5517.2],[77372235,1508067358000,0.020001,5517.8],[77372220,1508067352000,-0.41883579,5517.3],[77372218,1508067352000,-1.05740887,5517.2],[77372211,1508067351000,-1.8084,5517.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]] 

我的課表

public class Root 
{ 
    public int ChannelId { get; set; } 

    public List<Item> Data { get; set; } 

} 

public class Item 
{ 
    public int Id { get; set; } 
    public long Timestamp { get; set; } 

    public decimal Price { get; set; } 
    public decimal Size { get; set; } 
} 
+0

是不是有你的輸入的JSON格式? – Shaw

+0

我對樣本進行了重新格式化。 Json在類之上。 – endeffects

回答

2

如果使用Newtonsoft JSON library(如今被稱爲JSON.NET),您可以使用Jsonconverter class來創建自己的自定義轉換器。

你的類,然後將類似:

public class MyCustomConverter : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      return typeof(Root).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo()); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      if (reader.TokenType == JsonToken.StartArray) 
      { 
       JArray rootToken = JArray.Load(reader); 

       if (rootToken[0] != null && rootToken[1] != null) 
       { 
        var root = new Root(rootToken[0].Value<int>(), this.readItems(rootToken[1])); 
        return root; 
       } 
      } 

      return existingValue; 
     } 

     private IList<Item> readItems(JToken items) 
     { 
      var itemList = new List<Item>(); 
      if (items.Type == JTokenType.Array) 
      { 
       foreach(var item in items.Children()) 
       { 
        if (item.Type == JTokenType.Array && item.Count() == 4) 
        { 
         itemList.Add(new Item(
          item[0].Value<int>(), 
          item[1].Value<long>(), 
          item[2].Value<decimal>(), 
          item[3].Value<decimal>())); 
        } 
       } 
      } 

      return itemList; 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

請注意,如果你希望它能夠變換Root對象在當前狀態下此自定義轉換器是唯一能夠將JSON爲對象的,到一個JSON字符串,你需要自己實現WriteJson方法。

你說過,由於解耦的依賴關係,你不能改變被調用者調用反序列化方法的方式。你可以做的是覆蓋JSONConvert.DefaultSettings屬性,並明確告訴它使用自定義轉換器。

 JsonConvert.DefaultSettings = (() => 
     { 
      var settings = new JsonSerializerSettings(); 
      settings.Converters.Add(new MyCustomConverter()); 
      return settings; 
     }); 

     var jsonString = "..."; 
     var root = JsonConvert.DeserializeObject(jsonString, typeof(Root)); 
+0

非常感謝您的解決方案。大! :) – endeffects

1

首先解析您的JSON來JArray然後您可以簡單地創建一個函數來將其解析爲您所選擇的對象。你可以試試這個:

string json = "[71,[[77372266,1508067366000,-0.12144759,5517.4],[77372265,1508067366000,-0.020001,5518.2],[77372251,1508067362000,-0.01,5517.2],[77372235,1508067358000,0.020001,5517.8],[77372220,1508067352000,-0.41883579,5517.3],[77372218,1508067352000,-1.05740887,5517.2],[77372211,1508067351000,-1.8084,5517.2],[77372207,1508067350000,-0.01565918,5517.2],[77372206,1508067349000,-0.01721768,5514.3],[77372205,1508067349000,-0.10347625,5514.3],[77372201,1508067348000,-1.08183286,5513.1],[77372200,1508067348000,-0.04218858,5513.1],[77372199,1508067348000,-0.020001,5513.3],[77372198,1508067348000,-0.020001,5513.3],[77372197,1508067348000,-0.020001,5513.3],[77372196,1508067348000,-0.020001,5513.3],[77372195,1508067348000,-2.16396207,5513.3],[77372194,1508067348000,-1.5601,5513.5],[77372193,1508067348000,-0.13520397,5514.2],[77372192,1508067347000,-0.01479603,5514.2],[77372191,1508067347000,-0.13659854,5513.4],[77372189,1508067346000,-0.01597635,5513.3],[77372187,1508067346000,-0.19812221,5513.3],[77372184,1508067346000,-0.01261482,5513.3],[77372183,1508067346000,0.131033,5519.7],[77372182,1508067346000,0.2011,5519.4],[77372181,1508067346000,0.074337,5518.2],[77372180,1508067346000,0.125,5517.5],[77372179,1508067346000,0.06401,5516.5],[77372178,1508067346000,0.05305,5516.3]]]"; 

var array = JArray.Parse(json); 

var channelId = array[0]; 
var listData = array[1].ToList(); 

Root root = new Root(); 
root.ChannelId = Convert.ToInt32(channelId); 
root.Data = new List<Item>(); 
for (int i = 0; i < listData.Count; i++) 
{ 
    Item newItem = new Item(); 
    var item = listData[i].ToList(); 

    newItem.Id = Convert.ToInt32(item[0]); 
    newItem.Timestamp = Convert.ToInt64(item[1]); 
    newItem.Price = Convert.ToDecimal(item[2]); 
    newItem.Size = Convert.ToDecimal(item[3]); 
    root.Data.Add(newItem); 
} 
+0

感謝您的幫助,但如上所述,我需要使用Attributes,因爲我無法更改反序列化調用。 – endeffects

相關問題