【问题标题】:Different format JSON deserializing to object不同格式的 JSON 反序列化为对象
【发布时间】:2021-06-02 23:39:27
【问题描述】:

我有一个从 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
    ]
]

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

我的最终目标是我想将其反序列化为 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; }
    }

谢谢

【问题讨论】:

  • 当您说“我可以将其发送到其他地方。”时,这是否意味着您会将其发布到另一个 API?
  • 是的,正确,我想将它映射到这个对象,我可以轻松地自动映射到我们的响应模型之一。问题是将它从这里的这种格式变成一个模型。我已经用响应模型更新了我的原始帖子,请看一下

标签: c# json asp.net-core websocket json.net


【解决方案1】:

如果您的结构与示例中的结构一样简单,并且前 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);

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这个类的结构是什么样的? JSON 没有任何键,只有值。
    • 您可以创建自己的密钥。阅读 api 的文档并了解每个值的含义,然后创建自己的类。
    • 哪个API?我在上面添加了一个模型结构
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2020-08-21
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多