不同格式 JSON 反序列化为对象

Different format JSON deserializing to object

我有一个从 Poloniex 的 API 收到的数据内存流。 https://docs.poloniex.com/#ticker-data

API 中的数据格式如下:

[
    1002,
    null,
    [
        149,
        "382.98901522",
        "381.99755898",
        "379.41296309",
        "-0.04312950",
        "14969820.94951828",
        "38859.58435407",
        0,
        "412.25844455",
        "364.56122072",
        0,
        0
    ]
]

我可以看到这是有效的 json https://jsonlint.com/

我的最终目标是将其反序列化为 C# 中的一个对象,我可以将其发送到其他地方。

我以前从未见过这样的 JSON,不确定如何将此结构反序列化到我自己的模型中。我习惯将 JSON 视为 keyvaluepairs

我已经反序列化为 JArray 并从那里开始,但我不确定最佳方法。

var deserialized = 
    (JArray)_serializer.Deserialize(new JsonTextReader(new StreamReader(stream)) 
    { 
        CloseInput = false 
    });

最好的方法是什么?

要反序列化为的示例模型结构:

public class PoloniexResponseDataRoot
    {
        public List<PoloniexResponseDataParent> Children { get; set; }
    }

    public class PoloniexResponseDataParent
    {
        public int ChannelNumber { get; set; }
        public int? OtherNumber { get; set; }
        public List<PoloniexResponseDataChild> Children { get; set; }

    }

    public class PoloniexResponseDataChild
    {
        public object Data { get; set; }
    }

谢谢

这个 JSON 基本上是一个对象数组。

List<object> items = _serializer.Deserialize<List<object>>(jsonString);

然后您可以创建一个新的 class 并将该对象分配给 class 或者简单地使用它。

如果您的结构与示例中的结构一样简单,并且前 2 个数字始终代表 ChannelNumberOtherNumber,后跟 1 级数组,那么您可以这样做:


private static PoloniexResponseDataParent Parse(JArray objects)
{
    var parent = new PoloniexResponseDataParent();
    var channelNumber = objects[0];
    var otherNumber = objects[1];
    var children = objects[2];
    parent.ChannelNumber = Convert.ToInt32(channelNumber);
    parent.OtherNumber = (otherNumber as JValue).Value<int?>();
    parent.Children = children.Select(item => new PoloniexResponseDataChild
    {
        Data = item switch
        {
            JValue jValue => jValue.Value,
            _ => throw new ArgumentOutOfRangeException(nameof(item))
        }
    }).ToList();
    return parent;
}



var jArray = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(jsonStr);

var parent = Parse(jArray);