所以,我有一个自定义课程' User'像这样:
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" UserCreator有一个方法" GenerateList"和方法" WriteList"以及一个只是一个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的已知限制吗?或者可能是由于访问修饰符?
答案 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。