首页 > 解决方案 > 如何使用 JSON.NET 将 JSON 数组中的对象名称用作属性值?

问题描述

我有以下 JSON 块(从完整的 JSON 中提取以简化问题):

 "statistics": [
  {
    "Strength": {
      "min": 16,
      "max": 20
    }
  },
  {
    "Dexterity": {
      "min": 16,
      "max": 20
    }
  }]

我想将“统计”数组反序列化为“统计”对象的 C# 数组,但我找不到如何做到这一点...每个统计对象的键可以是任何东西:“强度”、“运气” ","Dexterity" 等等,每个键都是唯一的。

C# 数据对象将是这样的:

public class Container
{
    public Statistic[] Statistics { get; set; }
}

public class Statistic
{
    //Contains the name of the statistic
    public string Name { get; set; }
    public int Min { get; set; }
    public int Max { get; set; }
}

也许我可以通过删除属性并创建所有可能的统计类来使用某种多态性Name,但这会破坏我的代码的适应性。

十分感谢。

标签: c#jsonserializationjson.netjson-deserialization

解决方案


您可以使用简单JsonConverterStatistic类来处理这个棘手的 JSON,如下所示:

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        JProperty prop = jo.Properties().First();
        Statistic stat = new Statistic
        {
            Name = prop.Name,
            Min = (int)prop.Value["min"],
            Max = (int)prop.Value["max"]
        };
        return stat;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

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

要使用它,[JsonConverter]向类添加一个属性Statistic,它应该可以按预期工作:

[JsonConverter(typeof(StatisticConverter))]
public class Statistic
{
    public string Name { get; set; }
    public int Min { get; set; }
    public int Max { get; set; }
}

这是一个工作演示:https ://dotnetfiddle.net/H7wR0g

如果您不能(或不想)向Statistic类添加属性,也可以通过将转换器传递给如下DeserializeObject方法来使用转换器:

var container = JsonConvert.DeserializeObject<Container>(json, new StatisticConverter());

小提琴:https ://dotnetfiddle.net/UTLzBk


推荐阅读