gpt4 book ai didi

c# - 使用 RestSharp 反序列化具有未知键的字典

转载 作者:行者123 更新时间:2023-11-30 23:13:02 25 4
gpt4 key购买 nike

我目前正在获取一个形状类似于以下内容的 JSON 对象:

{
more data here...
"years": {
"value": 2013,
"item1": {
"total": 0.1044,
"Low": 0.0143,
"Mid": 0.1044,
"High": 0.3524,
"min": 0.0143,
"max": 0.3524,
},
"item2": {
"total": 0.1702,
"Low": 0.167,
"Mid": 0.1702,
"High": 0.1737,
"min": 0.167,
"max": 0.1737,
},...
}
}

不幸的是,我无法控制 JSON 的形状。

我正在尝试让 RestSharp 将其反序列化为一个对象,其中 Item1、Item2 和其余填充到字典中我目前有以下代码:

public class Year
{
public int Value { get; set; }
public Dictionary<string, Data> Data { get; set; }
}

public class Data
{
public decimal Total { get; set; }
public decimal Low { get; set; }
public decimal Mid { get; set; }
public decimal High { get; set; }
public decimal Min { get; set; }
public decimal Max { get; set; }
}

而我希望得到Item1、Item2等作为Dictionary的键和下面的值填充Data类作为Dictionary的值。但它目前不起作用(我的结构的其余部分是,它只是最里面的部分)。我只是接近错误的结构吗?我想避免为 Item1 和 Item2 创建一个特定的类。

最佳答案

您可以使用自定义 JsonConverter:

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

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = JObject.Load(reader);

int year = (int)obj["value"];
var data = new Dictionary<string, Data>();

foreach (var dataItem in obj.Children()
.OfType<JProperty>()
.Where(p => p.Name.StartsWith("item")))
{
data.Add(dataItem.Name, dataItem.Value.ToObject<Data>());
}

return new Year
{
Value = year,
Data = data
};
}

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

用转换器装饰你的 Year 类:

[JsonConverter(typeof(YearConverter))]
public class Year
{
public int Value { get; set; }
public Dictionary<string, Data> Data { get; set; }
}

像这样使用它,例如:

class Program
{
static void Main(string[] args)
{
string json = @"
{
""value"": 2013,
""item1"": {
""total"": 0.1044,
""Low"": 0.0143,
""Mid"": 0.1044,
""High"": 0.3524,
""min"": 0.0143,
""max"": 0.3524,
},
""item2"": {
""total"": 0.1702,
""Low"": 0.167,
""Mid"": 0.1702,
""High"": 0.1737,
""min"": 0.167,
""max"": 0.1737,
}
}";
var years = JsonConvert.DeserializeObject<Year>(json);
}
}

关于c# - 使用 RestSharp 反序列化具有未知键的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43792465/

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