【问题标题】:How to serealize a list of type interface with Newtonsoft.Json?如何使用 Newtonsoft.Json 序列化类型接口列表?
【发布时间】:2022-11-22 18:51:36
【问题描述】:

我正在尝试获取共享相同接口的不同类的列表。但是,出现以下错误:

Newtonsoft.Json.JsonException:没有为“StudentHousingFramework.Interfaces.IAccount”定义无参数构造函数。

这是发生错误的地方:

public void Serealise<T>(string nameList, List<T> list)
    {
        path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, nameList);
        string jsonString = JsonConvert.SerializeObject(list, Formatting.Indented, new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
            TypeNameHandling = TypeNameHandling.Auto
        }); ;

        File.WriteAllText(path, jsonString);
    }

在这里,我试图序列化,例如,类 rooms 的列表恰好有一个名为 IAccount 的接口。

这是那个课程:

    public class Room : IAccount
{
    public List<ITask> tasksToDo { 
        get
        {
            return factory.manager.tasks.FindAll(w => w.claimer == this);
        }
    }

    public Login login { get; set; }
    public bool isOccupied { get; private set; } = true;
    public int id { get; set; }
    public string name
    {
        get
        {
            return "Room " + id;
        }
    }
    
    public Json json { get; set; } = new Json();
    private Factory factory { get; set; }

    public Room(Factory factory, int id)
    {
        this.factory = factory;
        this.id = id;
        login = new Login();
    }


}

这是界面:

[JsonConverter (typeof(IAccount))]
public interface IAccount
{
    public Json json { get; set; }
    Login login { get; set; }
    int id { get; set; }
    string name { get;}
}

我能做些什么来挽救这种情况吗?

【问题讨论】:

  • 你正试图反序列化,并且您不能在界面中执行此操作。 Newtonsoft 应该实例化什么类?它不知道。反序列化为 List&lt;Room&gt;
  • 假设你是一个序列化程序。你会怎么做你自己?如果您没有实施,您怎么知道该怎么做?
  • 序列化@CodeCaster 时发生错误。有关更多信息,请参阅编辑
  • @CitrusBoy,在您向我们展示的代码中,您究竟在哪里序列化了任何内容?
  • @CodeCaster 我发布了错误的东西 m8。完全是我的错

标签: c# json.net


【解决方案1】:
[JsonConverter(typeof(IAccount))]

那不是有效的转换器类型。删除它。

NewtonSoft JSON 试图将 IAccount 实例化为 custom converter,但它不能,因为它是一个接口(并且不继承 JsonConverter)。

【讨论】:

  • 那我该怎么办?感谢您的反馈。我已经删除了它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多