Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用JSON.Net对接口列表中的属性进行序列化和反序列化_C#_Asp.net Web Api_Json.net - Fatal编程技术网

C# 使用JSON.Net对接口列表中的属性进行序列化和反序列化

C# 使用JSON.Net对接口列表中的属性进行序列化和反序列化,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我在这里读过几篇类似的帖子,但大多数帖子都试图做一些比我想做的更难的事情。其余的职位似乎对我不起作用 我有两门课: public class Zone { public Zone() { Areas = new List<IZoneArea>(); } public string Name { get; set; } public List<IZoneArea> Areas { get; set; } } public class ZoneArea {

我在这里读过几篇类似的帖子,但大多数帖子都试图做一些比我想做的更难的事情。其余的职位似乎对我不起作用

我有两门课:

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; }
}
  • 经过几次修改后,我采用了与SO不同的推荐方法,并从Zone类中删除了该属性,而是创建了一个CustomCreationConverter,如下所示:

    // 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);
        }
    
     public class ZoneAreaConverter : CustomCreationConverter<IZoneArea>
     {
          public override IZoneArea Create(Type objectType)
          {
              return new ZoneArea();
          }
     }
    
    公共类ZoneAreaConverter:CustomCreationConverter
    {
    公共覆盖IZoneArea创建(类型objectType)
    {
    返回新的ZoneArea();
    }
    }
    
  • 并试图反序列化为:

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

    我一直觉得自己很接近,但错过了一些东西。

    在我看来,你做的比你需要做的更多。您编写自定义转换器有什么原因吗?我已经发布了一个答案,仅使用标准的JsonConvert方法,似乎它们在您的情况下应该可以正常工作。我无法重现您的问题—您的
    CustomCreationConverter
    工作正常。看见您是否可以编辑您的问题以包含重现您的问题的问题?为什么要传递转换器?什么是缓存?您是否简单地尝试过:
    returnserializer.Deserialize(reader)在你的ReadJson方法中?@dbc我怎么会错过dotnetfiddle.net!这太棒了!事实上你是对的。我把所有的东西都放进自己的解决方案中,效果非常好。格式。缩进对流程很重要,还是只是让它更具可读性?@jrandomuser-Formatting。缩进只是为了让它看起来漂亮。在我看来,你做的比你需要做的更多。您编写自定义转换器有什么原因吗?我已经发布了一个答案,仅使用标准的JsonConvert方法,似乎它们在您的情况下应该可以正常工作。我无法重现您的问题—您的
    CustomCreationConverter
    工作正常。看见您是否可以编辑您的问题以包含重现您的问题的问题?为什么要传递转换器?什么是缓存?您是否简单地尝试过:
    returnserializer.Deserialize(reader)在你的ReadJson方法中?@dbc我怎么会错过dotnetfiddle.net!这太棒了!事实上你是对的。我把所有的东西都放进自己的解决方案中,效果非常好。格式化.Indented对流程很重要,还是只是让它更可读?@jrandomuser-Formatting.Indented只是让它看起来更漂亮。