C#:List <customclass>的JSON序列化返回空数组?

时间:2018-03-08 15:31:19

标签: c# json.net

所以,我有一个自定义课程&#39; User&#39;像这样:

class User
    {
        string firstname;
        string lastname;
        string proposedname;
        public User(string firstname, string lastname)
        {
            this.firstname = firstname;
            this.lastname = lastname;
            this.proposedname = $"{firstname}.{lastname}".ToLower();
        }
}

另一个Class&#34; UserCreator有一个方法&#34; GenerateList&#34;和方法&#34; WriteList&#34;以及一个只是一个List的字段:

public class UserCreator
    {
        internal List<User> Users;
        public UserCreator(int n = 1000)
        {
            Users = new List<User>();
            this.GenerateList(n);
        }
       public  void WriteList(string outputPath)
        {
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(this.Users, Newtonsoft.Json.Formatting.Indented);
            System.IO.File.WriteAllText(outputPath, json);

        }

        void GenerateList(int amount)
        {
            List<User> result = new List<User>();
            ///...
            this.Users = result;
        }
    }

一切正常,直到它进入WriteList()的序列化部分。而不是像预期的那样工作我得到这样的东西:

[
  {},
  {},
  {},
  {},
  {},
  {},
  {},
  {}
]

我猜测它与我使用自定义类的列表的事实有关。这是Newtonsoft.Json的已知限制吗?或者可能是由于访问修饰符?

2 个答案:

答案 0 :(得分:6)

如何宣布您的班级完全封装了您的所有用户数据。

而不是属性,这些是实例字段(或类成员,如果我们挑剔),默认情况下这些是私有的。相反,请注意您的访问修饰符,至少为每个属性公开一个公共getter,如下所示:

public class User
{
    public string firstname { get; private set;}
    public string lastname { get; private set;}
    public string proposedname { get ; private set; }
    public User(string firstname, string lastname)
    {
        this.firstname = firstname;
        this.lastname = lastname;
        this.proposedname = $"{firstname}.{lastname}".ToLower();
    }
}

答案 1 :(得分:1)

默认情况下,访问级别是私有的,因此您的firstName,lastName,proposedName都是私有字段。您可以将此更改为公开。或者您也可以为jsonserialzation设置编写customcontractresolver。