簡體   English   中英

我如何反序列化json,以便將某些json屬性分配給數組或列表?

[英]How do I deserialize json so that some json properties gets assigned to an array or List?

使用Json.Net,如何將以下json反序列化為下面提供的OrderDepthFeed類? 我希望將bid1放入Bid [0],將bid2放入Bid [1],依此類推。

{
    "i": "101",
    "m": 11,
    "tick_timestamp": 1440479701986,
    "bid1": 78.00,
    "bid_volume1": 60,
    "bid_orders1": 1,
    "ask1": 80.50,
    "ask_volume1": 500,
    "ask_orders1": 1,
    "bid2": 77.50,
    "bid_volume2": 500,
    "bid_orders2": 1,
    "ask2": 82.00,
    "ask_volume2": 1560,
    "ask_orders2": 2,
    "bid3": 77.00,
    "bid_volume3": 107,
    "bid_orders3": 2,
    "ask3": 82.95,
    "ask_volume3": 75,
    "ask_orders3": 1,
    "bid4": 76.30,
    "bid_volume4": 200,
    "bid_orders4": 1,
    "ask4": 83.40,
    "ask_volume4": 49,
    "ask_orders4": 1,
    "bid5": 76.00,
    "bid_volume5": 506,
    "bid_orders5": 2,
    "ask5": 83.50,
    "ask_volume5": 1500,
    "ask_orders5": 1
}

-

public class OrderDepthFeed {
    public int I { get; set; }
    public int M { get; set; }
    public int TickTimestamp { get; set; }

    public double?[] Ask { get; set; }
    public int?[] AskVolume { get; set; }
    public double?[] Bid { get; set; }
    public int?[] BidVolume { get; set; }
}

這是我使用的代碼,而PascalCaseContractResolver僅通過重寫ResolvePropertyName()來更改大小寫並刪除屬性名稱中的下划線;

var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new PascalCaseContractResolver();
var orders = JsonConvert.DeserializeObject<OrderDepthFeed>(json, serializerSettings);

這是一個自定義轉換器:

public class JsonOrderDepthFeedConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        //implement this if you want to convert to json in the same way
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var order = JObject.Load(reader);
        var orderDepthFeed = new OrderDepthFeed
        {
            I = order["i"].Value<int>(),
            M = order["m"].Value<int>(),
            TickTimestamp = order["tick_timestamp"].Value<long>()
        };

        const int count = 5;
        orderDepthFeed.Ask = new double?[count];
        orderDepthFeed.AskVolume = new int?[count];
        orderDepthFeed.Bid = new double?[count];
        orderDepthFeed.BidVolume = new int?[count];

        for (var i = 1; i <= count; i++)
        {
            JToken aux;

            if (order.TryGetValue("ask" + i, out aux)) orderDepthFeed.Ask[i - 1] = aux.Value<double>();
            if (order.TryGetValue("ask_volume" + i, out aux)) orderDepthFeed.AskVolume[i - 1] = aux.Value<int>();
            if (order.TryGetValue("bid" + i, out aux)) orderDepthFeed.Bid[i - 1] = aux.Value<double>();
            if (order.TryGetValue("bid_volume" + i, out aux)) orderDepthFeed.BidVolume[i - 1] = aux.Value<int>();
        }

        return orderDepthFeed;
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(OrderDepthFeed) == objectType;
    }
}

以及如何使用它:

var settings = new JsonSerializerSettings { Converters = { new JsonOrderDepthFeedConverter() } };
var order = JsonConvert.DeserializeObject<OrderDepthFeed>(json, settings);

編寫自己的JsonConverter以便完全控制(反序列化)。 創建一個從JsonConverter派生的類,並重寫以下方法: CanConvertReadJsonWriteJson

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM