【问题标题】:Deserialize json array to objects fails [duplicate]将json数组反序列化为对象失败[重复]
【发布时间】:2021-08-19 13:55:51
【问题描述】:

我正在尝试反序列化这个字符串:

[[1627948800000 “33361.77000000”, “33881.50000000”, “32832.75000000”, “32953.11000000”, “513.87963000” 1627963199999 “17079364.00614616”,18285, “267.93047400”, “8902854.13595806”, “0”],[1627963200000 “32958.11000000”, “33082.10000000”, “32350.00000000”, “32887.55000000”, “473.31029500” 1627977599999 “15473902.88026993”,19157, “218.09445000”, “7129688.95708971”, “0”],[1627977600000 “32889.44000000”,” 33045.20000000","32650.48000000","32745.58000000","297.93607700",1627991999999,"9785835.12349423",14516,"151.51781200","4976292.204"]p>"

进入这个对象:

[JsonArray]
public class CandlestickData
{
    [JsonProperty(Order = 1)]
    public long OpenTime { get; set; }
    [JsonProperty(Order = 2)]
    public decimal Open { get; set; }
    [JsonProperty(Order = 3)]
    public decimal High { get; set; }
    [JsonProperty(Order = 4)]
    public decimal Low { get; set; }
    [JsonProperty(Order = 5)]
    public decimal Close { get; set; }
    [JsonProperty(Order = 6)]
    public decimal Volume { get; set; }
    [JsonProperty(Order = 7)]
    public long CloseTime { get; set; }
    [JsonProperty(Order = 8)]
    public decimal QuoteAssetVolume { get; set; }
    [JsonProperty(Order = 9)]
    public long NumberOfTrades { get; set; }
    [JsonProperty(Order = 10)]
    public decimal TakerBuyBaseAssetVolume { get; set; }
    [JsonProperty(Order = 11)]
    public decimal TakerBuyQuoteAssetVolume { get; set; }
    [JsonProperty(Order = 12)]
    public decimal Ignore { get; set; }
}

我尝试过使用JsonConvert.DeserializeObject<CandlestickData[]>(content);,其中content 是上面提到的字符串。

但是,我收到以下错误:

无法创建和填充列表类型 CandlestickData。

我尝试将小数更改为字符串,但这给了我同样的错误。反序列化此字符串的正确方法是什么?我无法控制创建的 json。

【问题讨论】:

  • 不确定 JsonProperty 上的 Order= 是否符合您的想法。它定义了在序列化过程中写入 props 的顺序;它不是将数组解包到不同道具中的设备
  • 什么是反序列化这个字符串的正确方法? - 可能有很多,但是让你所有的道具 JsonIgnore,只需要一个 object[] 道具(不是那个props 应该返回数组但是..) 并且让每个 prop 采用不同的数组索引可能会起作用.. 除此之外,我认为您可能正在查看自定义的 deser 例程
  • public class RootBase { public List<List<object>> MyArray { get; set; } } => RootBase myDeserializedClass = JsonConvert.DeserializeObject<RootBase>(content); 否则遵循@CaiusJard 提到的内容。另外值得一提的是,您是否可以控制创建该 json,如果可以,请将其更改为 key:value,以便您实际上拥有属性名称及其值;反序列化和获得你需要的东西将是轻而易举的事。
  • 我无法控制创建的 json。这就是问题所在。当我尝试使用 CandlestickData 对象列表创建类 Rootbase 时,出现错误“无法创建和填充列表类型 RootBase。”。
  • 使用ObjectToArrayConverter<CandlestickData>,其中ObjectToArrayConverter<T> 显示在this answerC#: Parsing a non-JSON array-only api response to a class object with x properties(重复)中,最初来自How to deserialize an array of values with a fixed schema to a strongly typed data class?

标签: c# json .net json.net


【解决方案1】:

您的 json 文本和您的代码不匹配。您在该 json 文本中有一个项目列表,并且您的代码中有一个类。我建议您制作一个 CandleStickData 列表(如其中 3 个),然后对其进行序列化并检查 json 文本输出。然后,您需要更改 json 文本以匹配该格式。执行此操作时,还要摆脱您正在使用的那些 json 属性。

【讨论】:

  • 在 cmets 中,询问状态 我无法控制创建的 json。 因此他们无法 更改 [the] json 文本以匹配该格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多