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

标签 c# restsharp json-deserialization

我目前正在获取一个形状类似于以下内容的 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 等作为字典的键,并将其下面的值填充到数据类作为字典的值。但它目前不起作用(我的结构的其余部分是,这只是最里面的部分)。我只是错误地接近结构吗?我想避免为 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/

相关文章:

c# - 错误 CS0246 找不到类型或命名空间名称 'JsonDeserializer' (RestSharp v107)

Azure函数调用其他API,失败并显示 'A connection attempt failed because the connected party did not properly respond after a period of time,,,'

java - 用于接口(interface)的 Kafka JSON 反序列化器

c# - 如何限制 foreach 循环中迭代的元素数量?

c# - Blazor HttpContext Graph API 面临的挑战

c# - 通过 Postman 插件将值 [FromBody] 传递给 post 方法时为空值

c# - 当属性名称包含空格和保留字时将 JSON 映射到 C# 类

c# - 等同于 C# 异步套接字中的 Peek?

c# - 在 JsonDeserializer 中正确跳过父级

c# - 无法将 HttpResponseMessage 反序列化为模型对象