使用JSON.Net序列化和反序列化作为接口列表的属性

时间:2016-03-29 16:20:36

标签: c# asp.net-web-api json.net

我在这里阅读了几篇类似的帖子,但他们中的大多数都试图做一些比我想要完成的更难的事情。其余的帖子似乎对我没用。

我有2个班级:

public class Zone
{
   public Zone() { Areas = new List<IZoneArea>(); }
   public string Name { get; set; }
   public List<IZoneArea> Areas { get; set; }
}

public class ZoneArea
{
   public string Name { get; set; }
}

我想要做的就是选择一个人口密集的区域,例如:列出区域,并成功序列化它们并使用JsonConvert和Serialize / Deserialize Object方法对它们进行DeSerialize。我似乎无法让它发挥作用。

这是我到目前为止所尝试的内容: 1.在区域类中的区域属性上方添加了一个属性,如跟随[JsonConverter(typeof(ZoneAreaConverter))]

然后编写并尝试了几个不同的ZoneArea转换器,如下所示:

// This method is the same in all the variations
public override bool CanConvert(Type objectType)
{
    return objectType == typeof(IZoneArea);
}

// The following is only one of the variations of the ReadJson method I tried
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var data = JObject.Load(reader);
        var area = new ZoneArea();
        serializer.Populate(data.CreateReader(), area);

        return area;
    }

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
  1. 经过几次变化之后,我从SO处采取了不同的推荐方法,并从Zone类中删除了该属性,而是创建了一个CustomCreationConverter,如下所示:

     public class ZoneAreaConverter : CustomCreationConverter<IZoneArea>
     {
          public override IZoneArea Create(Type objectType)
          {
              return new ZoneArea();
          }
     }
    
  2. 并尝试反序列化:

      var zones = JsonConvert.DeserializeObject<List<Zone>>(cache.Cache.ToString(), new ZoneAreaConverter());
    

    我一直觉得自己非常接近但却错过了什么。

0 个答案:

没有答案