gpt4 book ai didi

c# - 使用数组反序列化响应

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:49 25 4
gpt4 key购买 nike

我正在使用 json.net,我在反序列化来自服务器的 json 响应时遇到问题我不知道我应该为两个属性 errorsdata 使用什么数据类型。

有没有办法排除这两个属性以外的其他属性?服务器正在返回大量我不感兴趣的数据。

我还使 Data 类中的数据类型可以为 null,因为当值未知时服务器返回 null 是解决此问题的正确方法吗?

class DataFormat
{
[JsonProperty("errors")]
public Object Errors { get; set; }

...

[JsonProperty("data")]
public List<Data> Data { get; set; }
}

class Data
{
public DateTime Date { get; set; }
public double? Open { get; set; }
public double? High { get; set; }
public double? Low { get; set; }
public double? Last { get; set; }
public double? Change { get; set; }
public double? Settle { get; set; }
public int? Volume { get; set; }
public int? OpenInterest { get; set; }
}

我正在尝试反序列化 json

{
"errors": {},

...

"data": [
["2014-06-13", 2.9959, 3.0302, 2.9853, 0838, null, 2.9943, 27331.0, 51662.0],
["2014-06-12", 2.9092, 3.0017, 2.908, null, 0.0838, 2.9948, 35321.0, 47057.0]]
}

最佳答案

要排除您不感兴趣的 JSON 属性,只需将这些成员从您的类中删除即可。 Json.Net 默认会忽略它们。

如果 JSON 中的数字或日期值可以为 null,那么在您的类中使其可为 null 正是处理它的正确方法。

如果您不确定要制作什么类型 Error , 然后 object可以。您也可以使用 Dictionary<string, object>这里。如果你有 Error 的例子数据然后你可以为它创建一个合适的类。

您可以使用 JsonConverter将数组数据变成你想要的对象格式。
这是转换器的样子:

public class DataListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Data);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken array = JToken.Load(reader);
List<Data> list = new List<Data>();
foreach (JArray data in array.Children<JArray>())
{
list.Add(new Data
{
Date = data[0].ToObject<DateTime>(),
Open = data[1].ToObject<double?>(),
High = data[2].ToObject<double?>(),
Low = data[3].ToObject<double?>(),
Last = data[4].ToObject<double?>(),
Change = data[5].ToObject<double?>(),
Settle = data[6].ToObject<double?>(),
Volume = data[7].ToObject<int?>(),
OpenInterest = data[8].ToObject<int?>()
});
}
return list;
}

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

要使用它,只需添加一个 [JsonConverter]属性为 Data您的成员(member) DataFormat类:

class DataFormat
{
[JsonProperty("errors")]
public Dictionary<string, object> Errors { get; set; }

[JsonProperty("data")]
[JsonConverter(typeof(DataListConverter))]
public List<Data> Data { get; set; }
}

然后,您可以正常反序列化:

DataFormat df = JsonConvert.DeserializeObject<DataFormat>(json);

这是一个演示:

class Program
{
static void Main(string[] args)
{
string json = @"
{
""errors"": {},
""stuffToIgnore"" : ""foo bar"",
""data"": [
[""2014-06-13"", 2.9959, 3.0302, 2.9853, 0.0838, null, 2.9943, 27331.0, 51662.0],
[""2014-06-12"", 2.9092, 3.0017, 2.908, null, 0.0838, 2.9948, 35321.0, 47057.0]
]
}";

DataFormat df = JsonConvert.DeserializeObject<DataFormat>(json);

foreach (Data item in df.Data)
{
Console.WriteLine("Date: " + item.Date.ToShortDateString());
Console.WriteLine("Open: " + item.Open);
Console.WriteLine("High: " + item.High);
Console.WriteLine("Low: " + item.Low);
Console.WriteLine("Last: " + item.Last);
Console.WriteLine("Change: " + item.Change);
Console.WriteLine("Settle: " + item.Settle);
Console.WriteLine("Volume: " + item.Volume);
Console.WriteLine("OpenInterest: " + item.OpenInterest);
Console.WriteLine();
}
}
}

输出:

Date: 6/13/2014
Open: 2.9959
High: 3.0302
Low: 2.9853
Last: 0.0838
Change:
Settle: 2.9943
Volume: 27331
OpenInterest: 51662

Date: 6/12/2014
Open: 2.9092
High: 3.0017
Low: 2.908
Last:
Change: 0.0838
Settle: 2.9948
Volume: 35321
OpenInterest: 47057

关于c# - 使用数组反序列化响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24262400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com