我正在尝试序列化课程数据。我得到课程ID(C_id)和课程名称(C_Name)。我还有一件事是学生的Icoolection。当我尝试序列化时,我无法获得已注册该课程的学生的嵌套列表。
var u = (from g in t.courses
select g)
.ToList();
List<course> ui = u
.Select(d => new course()
{ C_Name = d.C_Name,
C_Id = d.C_Id,
student = d.student
})
.ToList();
ASCIIEncoding objASCIIEncoding = new ASCIIEncoding();
string strData = JsonConvert
.SerializeObject(ui, Formatting.Indented, new JsonSerializerSettings()
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
在上面的代码中,我正在使用嵌套的students
列表获取正确的数据,但是这行
string strData = JsonConvert.SerializeObject(ui, Formatting.Indented, new JsonSerializerSettings()
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});
执行我只获得课程ID(C_ID)和课程名称(C_Name)。嵌套的student
列表未序列化。
答案 0 :(得分:0)
来自文档:
Json.NET将忽略引用循环中的对象而不是序列化 他们。第一次遇到对象时,它将被序列化为 通常但如果对象是作为自身的子对象遇到的 序列化器将跳过序列化。
http://james.newtonking.com/json/help/index.html?topic=html/SerializationSettings.htm
我假设您的学生包含对他们课程的引用?也许你应该确保他们不要做类似下面的事情来删除对课程的引用:
student = d.student.Select(s => new {s.studentId, s.studentName}).ToList()
答案 1 :(得分:0)
希望这有助于http://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm
JsonSerializer上的PreserveReferencesHandling设置将更改所有对象的序列化和反序列化方式。对于应该将哪些对象和成员序列化为引用的细粒度控制,JsonObjectAttribute,JsonArrayAttribute和JsonPropertyAttribute上有IsReference属性。 将JsonObjectAttribute或JsonArrayAttribute上的IsReference设置为true将意味着JsonSerializer将始终序列化该属性所针对的类型作为引用。将JsonPropertyAttribute上的IsReference设置为true将仅将该属性序列化为引用。
[JsonObject(IsReference = true)]
public class EmployeeReference
{
public string Name { get; set; }
public EmployeeReference Manager { get; set; }
}